泛型委託例項

2021-04-03 01:33:01 字數 2913 閱讀 3317

先來看一下典型的window控制項的事件處理方式,舉兩個例子,乙個button的mouseclick事件,乙個linklabel的linkclicked事件:

this

.button1.mouseclick

+=new

system.windows.forms.mouseeventhandler(

this

.button1_mouseclick);

this

.linklabel1.linkclicked

+=new

system.windows.forms.linklabellinkclickedeventhandler(

this

.linklabel1_linkclicked);

這兩個事件分別是兩個委託型別:mouseeventhandler,linklabellinkclickedeventhandler.再來看看這兩個委託的定義:
public

delegate

void

mouseeventhandler(

object

sender, mouseeventargs e);

public

delegate

void

linklabellinkclickedeventhandler(

object

sender, linklabellinkclickedeventargs e);

現在,我們有了泛型委託,還需要兩個委託嗎?:)呵,這兩個委託完全可以採用乙個泛型委託就搞定了.
public

delegate

void

genericeventhandler

<

sender,genericeventargs

>

(sender sender,genericeventargs e) where genericeventargs : eventargs;

(請注意泛型委託的約束where genericeventargs : eventargs是為了遵循.net的事件模式,所有的事件引數必須繼承自eventargs.要不然,就真的成"胡言亂語"了:)

哈.既然能這樣了, .net中所有的void ***xeventhandler(***,***);現在不都可以通過這麼乙個泛型委託就搞定了?嘿嘿.所有這類的事件處理**看起來都統一了.並且,這樣還能得到型別安全的好處.我們在響應事件的時候,再也不用將object sender強制轉換成發出事件的實際型別.哈哈.好處好真是"大大的"哦.:)那是不是在.net 2.0裡面已經這樣處理了呢?我急匆匆的開啟vs 2005,發現事件委託還是老的,沒有用泛型委託,鬱悶.:(哈.肯定是ms閒改動起整個.net的委託來太麻煩了,姑且這麼認為吧.哈:)

於是,我自己寫了個小例子驗證這種做法:

首先,定義乙個泛型委託:

public

delegate

void

genericeventhandler

<

paramone,paramtwo

>

(paramone paramone,paramtwo paramtwo);

然後定義兩個不同的類,他們包含兩個不同的事件,但該事件的型別都是同乙個委託----這個泛型委託:
class

testclassone

}

protected

virtual

void

ontestclassevent(testclassoneeventargs e)

}

public

void

messagearrive(

string

message)

}

class

testclasstwo

}

protected

virtual

void

ontestclassevent(testclasstwoeventargs e)

}

public

void

messagearrive(

string

message)

}

現在,來看怎麼使用泛型委託:

static

void

main(

string

args)

static

void

two_testclassevent(testclasstwo paramone, testclasstwo.testclasstwoeventargs paramtwo)

static

void

one_testclassevent(testclassone paramone, testclassone.testclassoneeventargs paramtwo)

哈哈.感覺這樣做的兩個主要好處是:

一,原來在.net裡面需要寫兩個委託,現在只有用乙個委託就搞定.當然不僅僅是兩個委託可以用這個泛型委託來代替,只要委託的簽名符合這個泛型委託就可以了(在我的例子裡,只要是兩個引數的委託都可以.其實,還可以增加乙個返回值的泛型引數,這樣是不是更加爽啊^0^,我們可以象下面這樣定義這個泛型委託).

public

delegate

returntype genericeventhandler

<

paramone, paramtwo, returntype

>

(paramone paramone, paramtwo paramtwo);

二,看看我們的事件處理函式,現在再也不用出現(testclassone)sender的強制轉換的**了.使用者可以直接使用這個強型別的sender,哈.是不是覺得很爽啊:)反正我是這麼覺得的.-_-!

泛型 二 泛型委託

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

泛型委託Predicate

此委託返回乙個bool值,該委託通常引用乙個 判斷條件函式 需要指出的是,判斷條件一般為 外部的硬性條件 比如 大於50 而不是由資料自身指定,不如 查詢陣列中最大的元素就不適合 例子一 class program static void main string args i listall lst...

Func泛型委託

描述 封裝乙個具有乙個引數並返回tresult引數指定的型別值的方法.語法 public delegate tresult func t arg 引數型別 t 此委託封裝的方法的引數型別.tresult 此委託封裝的方法的返回值型別.引數 arg 委託封裝的方法的引數 返回值 此委託封裝的方法的返回...