第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時及為何使用代表?

何時及為何使用代表?

我在C#中相對較新,我想知道何時適當(dāng)使用Delegates。它們在事件聲明中被廣泛使用,但是我什么時候應(yīng)該在自己的代碼中使用它們,為什么它們有用? 為什么不使用其他東西?我也想知道何時必須使用委托,而沒有其他選擇。感謝您的幫助!編輯:我想我已經(jīng)在這里找到了必要的代表使用
查看完整描述

3 回答

?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個贊

我同意已經(jīng)說過的一切,只是嘗試在上面加上一些其他字眼。

可以將委托視為一種/某些方法的占位符。

通過定義委托,您對班級的用戶說:“ 請隨意將與該簽名匹配的任何方法分配給委托,每次我的委托被調(diào)用時,都會調(diào)用該委托?!?/p>

當(dāng)然,典型的用法是事件。所有OnEventX都委托給用戶定義的方法。

委托對于為對象的用戶提供一些自定義其行為的功能很有用。在大多數(shù)情況下,您可以使用其他方式來實(shí)現(xiàn)相同的目的,而且我認(rèn)為您永遠(yuǎn)不會被迫創(chuàng)建委托。在某些情況下,這只是完成任務(wù)的最簡單方法。


查看完整回答
反對 回復(fù) 2019-09-27
?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個贊

假設(shè)您要編寫一個過程,以在某個時間間隔[a,b] 上集成一些實(shí)值函數(shù)f(x)。假設(shè)我們要使用3點(diǎn)高斯方法來做到這一點(diǎn)(當(dāng)然任何人都可以)。


理想情況下,我們需要一些看起來像這樣的函數(shù):


// 'f' is the integrand we want to integrate over [a, b] with 'n' subintervals.

static double Gauss3(Integrand f, double a, double b, int n) {

  double res = 0;


  // compute result

  // ...


  return res;

}

因此,我們可以通過在任何Integrand,?F,并獲得其定積分在閉區(qū)間。


到底應(yīng)該Integrand是什么類型?


沒有代表

好吧,沒有委托,我們需要一種具有單個方法的接口,eval聲明如下:


// Interface describing real-valued functions of one variable.

interface Integrand {

  double eval(double x);

}

然后,我們需要創(chuàng)建一整套實(shí)現(xiàn)此接口的類,如下所示:


// Some function

class MyFunc1 : Integrand {

  public double eval(double x) {

    return /* some_result */ ;

  }

}


// Some other function

class MyFunc2 : Integrand {

  public double eval(double x) {

    return /* some_result */ ;

  }

}


// etc

然后要在我們的Gauss3方法中使用它們,我們需要按以下方式調(diào)用它:


double res1 = Gauss3(new MyFunc1(), -1, 1, 16);

double res2 = Gauss3(new MyFunc2(), 0, Math.PI, 16);

Gauss3的外觀如下所示:


static double Gauss3(Integrand f, double a, double b, int n) {

  // Use the integrand passed in:

  f.eval(x);

}

因此,我們需要做的所有事情只是在中使用我們的任意函數(shù)Guass3。


與代表

public delegate double Integrand(double x);

現(xiàn)在,我們可以定義一些遵循該原型的靜態(tài)(或非靜態(tài))函數(shù):


class Program {

   public delegate double Integrand(double x);   

   // Define implementations to above delegate 

   // with similar input and output types

   static double MyFunc1(double x) { /* ... */ }

   static double MyFunc2(double x) { /* ... */ }

   // ... etc ...


   public static double Gauss3(Integrand f, ...) { 

      // Now just call the function naturally, no f.eval() stuff.

      double a = f(x); 

      // ...

   }


   // Let's use it

   static void Main() {

     // Just pass the function in naturally (well, its reference).

     double res = Gauss3(MyFunc1, a, b, n);

     double res = Gauss3(MyFunc2, a, b, n);    

   }

}

沒有接口,沒有笨拙的.eval東西,沒有對象實(shí)例化,只是簡單的函數(shù)指針(如用法)來完成簡單的任務(wù)。


當(dāng)然,委托不只是幕后的函數(shù)指針,而且這是一個單獨(dú)的問題(函數(shù)鏈接和事件)。


查看完整回答
反對 回復(fù) 2019-09-27
  • 3 回答
  • 0 關(guān)注
  • 527 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號