集合和泛型11 泛型委託與泛型事件

2021-04-25 21:47:10 字數 1745 閱讀 2394

委託也可以泛型化,也就是委託也定義自己的型別引數,這樣的委託稱為泛型委託。在使用委託的**中可以給委託指定型別引數的具體型別,而讓泛型委託例項化為具體的委託例項。就像例項化泛型類或呼叫泛型方法一樣。

定義乙個泛型委託的語法格式:

[public|private|protected] delegate

返回型別 委託名《型別引數列表》(引數列表)

例如public delegate void del(t item);該委託表示了乙個返回void型別,而且引數的型別是t的函式或者方法。

例項化泛型委託並與函式或者方法繫結。比如,現在有乙個方法

public static void notify(int i)

,那麼delm1 = new del(notify);就是生成了乙個del型別的委託m1,該委託代表了方法notify。

泛型委託的呼叫:m1(1) ;該委託的呼叫與實際呼叫方法notify(1)效果一樣。注意在例項化泛型時,一定要給泛型委託指明型別引數的具體型別。該型別應該與委託所代表的方法或者函式的引數的型別相互對應。

例子genericsdelegate演示了乙個泛型委託的定義,例項化,繫結,呼叫的完整過程。例子中類providemethod專門提供了兩個引數型別不相同的兩個方法,在測試**中演示了完整的過程。

類providemethod的**

namespace

genericsdelegate

public

void methodcs(char c, string s)

} }

泛型委託的測試**

namespace

genericsdelegate

} }

在泛型類內部定義的委託使用泛型類型別引數的方式可以與類方法所使用的方式相同。

class stack

那麼在使用這個委託時,必須指定包含類的型別變數,否則這個委託所能夠代表的方法或者函式的型別就不能確定。如下所示:

private static void dowork(float items)

public static void teststack()

提起委託,就不能不說事件,事件與委託就像一對孿生兄弟。既然有泛型委託,那麼也應該有泛型事件。泛型事件在某些應用中比較重要。因為在以前,事件處理函式的傳送方引數的型別總是object。因此事件處理函式沒有辦法根據不同的傳送者身份或者型別對事件進行不同的處理。現在如果使用泛型事件就可以使用強型別的傳送方,不再需要強制轉換成object或反向強制轉換。而且也可以根據傳送方型別的不同對訊息進行不同的處理。

例子genericsevent中演示了傳送方是強型別的情況,在這個例子中依然使用泛型類publisher來表示訊息的發布者,用類receiver來表示訊息的訂閱者。

訊息發布者類publisher的**

namespace

genericsevent

} }

訊息訂閱者類receiver的**

namespace

genericsevent

//事件處理函式

public

void onclick(publisher

sender)

} }

測試**

namespace

genericsevent

} }

程式的執行結果是

該事件已經寫入日誌檔案

該事件已經傳送到主管信箱

這樣就可以根據傳送訊息者的身份對訊息進行不同的處理了。

泛型 二 泛型委託

using system using system.collections.generic using system.linq using system.text namespace 泛型委託 public event stackeventhandler,stackeventargs stackev...

泛型集合,非泛型集合

arraylist 非泛型集合 list 泛型集合 集合跟陣列比較我們更容易理解。陣列 1,長度固定2,資料型別預先宣告 集合 1,長度可變2,資料型別預先宣告的為泛型集合,資料型別不限定為非泛型 arraylist 長度不固定,元素資料型別為object的集合。object類之間或間接為所有類的父...

泛型 泛型簡介和泛型類

在泛型引入之前,如果我們需要產生多個物件,每個物件的邏輯完全一樣,只是物件內的成員變數的型別不同,那麼我們只能建立多個類檔案,給每個類的成員變數設定不同的資料型別。這麼做會導致類的膨脹,重用性太差。一種方式是對將object作為變數型別,但是需要對獲取的資料進行強制型別轉換,這個過程可能導致型別轉換...