C 中的委託和事件 三

2021-05-12 12:35:25 字數 2813 閱讀 3954

1、  匿名方法

到目前為止,要想使委託工作,方法必須已經存在(即委託是用方法的簽名定義的)。但使用委託還有另外一種方式:即通過匿名方法。匿名方法是用作委託引數的乙個**塊。

用匿名方法定義委託的語法與前面的定義並沒有什麼區別。但在例項化委託時,就有區別了。下面是乙個非常簡單的控制台應用程式,說明了如何使用匿名方法:

class program

;console.writeline(anondel("start of string"));}}

委託delegatetest定義為乙個類級變數,它帶乙個字串引數。有區別的是main方法。在定義anondel時,不是傳送已知的方法名,而是使用乙個簡單的**塊:

param += mid;

param += "and this was added to the string.";

可以看出,該**塊使用方法級的字串變數mid,該變數是在匿名方法的外部定義的,並新增到要傳送的引數中。接著**返回該字串值。在呼叫委託時,把乙個字串傳送為引數,將返回的字串輸出到控制台上。

匿名方法的優點是減少了系統開銷。方法僅在由委託使用時才定義的。在位事件定義委託時,這是非常顯然的。這有助於降低**的複雜性,尤其是定義了好幾個方法時,**會顯得比較簡單。

在使用匿名方法時,必須遵循兩個規則。在匿名方法中不能使用跳轉語句跳到該匿名方法的外部,反之亦然:匿名方法外部的跳轉語句不能跳到該匿名方法的內部。

在匿名方法內部不能訪問不安全的**。另外,也不能訪問在匿名方法外部使用的ref和out引數。但可以使用在匿名方法外部定義的其他變數。

2、 簡單的委託示例

在這個示例中,定義乙個類mathsoperations,它有兩個靜態方法,對double型別的值執行兩個操作,然後使用該委託呼叫這些方法。這個數學類如下所示:

class mathsoperations

public static double multiplybytwo(double value)

return value*2;

public static double square(double value)

return value*value;

下面呼叫這些方法:

using system;

namespace ******delegate

delegate double doubleop(double x);

class mainentrypoint

static void main()

;for(int i=0; i]:",i);

processanddisplaynumber(operations[i],2.0);

processanddisplaynumber(operations[i],7.94);

processanddisplaynumber(operations[i],1.414);

console.writeline();}}

static void processanddisplaynumber(doubleop action,double value)

,result of operation is",value,result);

}在這段**中,例項化了乙個委託陣列doubleop(記住,一旦定義了委託類,就可以例項化他的例項,就像處理一般的類那樣——所以把一些委託的例項放在陣列中是可以的)。該陣列的每個元素都初始化為由mathsoperations類執行的不同操作。然後迴圈這個陣列,把每個操作用用到3個不同的值上。這說明了使用委託的一種方式——把方法組合到乙個陣列中,這樣就可以在迴圈中呼叫不同的方法了。

這段**的關鍵一行是把委託傳遞給processanddisplaynumber()方法,例如:

processanddisplaynumber(operations[i],2.0);

其中傳遞了委託名,但不帶任何引數,假定operations[i]是乙個委託,其語法是:

1、operation[i]表示「這個委託」。換言之,就是委託代表的方法。

operations[i](2.0)表示「呼叫這個方法,引數放在括號中」。

processanddisplaynumber()方法定義為把乙個委託作為其第乙個引數:

static void processanddisplaynumber(doubleop action,double value)

在這個方法中,呼叫: double result =action(value);

這實際上是呼叫action委託例項封裝的方法,其返回結果儲存在result中。

執行這個示例,得到如下所示的結果:

******delegate

using operations[0]:

value is 2, result of operation is 4

如果在這個例子中使用匿名方法,就可以刪除第乙個類mathoperations。main方法應如下所示:

static void main()

doubleop multbytwo = delegate(double val)

doubleop square = delegate(double val)

doubleop operations = ;

for(int i=0;i]:",i);

processanddisplaynumber(operations[i],2.0);

processanddisplaynumber(operations[i[,7.94);

processanddisplaynumber(operations[i],1,414);

console.writeline();

}執行這個版本,結果與前面的例子相同,優點是刪除了乙個類。

C 中的委託和事件(三)

事件的由來 我們繼續思考上面的程式 上面的三個方法都定義在programe類中,這樣做是為了理解的方便,實際應用中,通常都是 greetpeople 在乙個類中,chinesegreeting和 englishgreeting 在另外的類中。現在你已經對委託有了初步了解,是時候對上面的例子做個改進了...

C 中的委託和事件

委託類似於c 中的函式指標,c 中的委託申明如下 delegate void mydelegate 只要該委託執行的方法與委託申明的簽名一致,就能呼叫委託來執行該方法,例如在本例中,有個方法為 void method 那麼就可以如下呼叫 mydelegate delegate new mydeleg...

C 中的委託和事件

委託 和 事件在 net framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是委託 為什麼...