新特性探究之委托與匿名委托呢
delegate經(jīng)常被人用來(lái)與回調(diào)相比較,其實(shí)兩者在某種程度上由很多共同點(diǎn)。不過(guò)delegate有很多更加強(qiáng)大的地方。
首先,delegate中可以注冊(cè)任意多個(gè)回調(diào),在一個(gè)delegate被調(diào)用的時(shí)候,已經(jīng)注冊(cè)的過(guò)程將會(huì)被逐個(gè)調(diào)用。
其次,delegate允許注冊(cè)一個(gè)對(duì)象的方法,而不像C++中指可以使用靜態(tài)方法或者全局方法作為函數(shù)指針,提供了更多的靈活性,同時(shí)也暗示我們,delegate中按照某種方式保存了object的很多信息。
在C#2.0的匿名delegate中,我們甚至可以訪問(wèn)當(dāng)前匿名委托的上下文變量。接下來(lái)的文章中我們將會(huì)通過(guò)實(shí)際的例子,來(lái)看看強(qiáng)大的delegate。
首先,讓我們看看在C#1.2中的一個(gè)典型的委托的寫(xiě)法。
public delegate void TheEvent(int a);
public void test()
{
TheEvent testdel1 = new TheEvent(del1);
testdel1(12);
}
public void del1(int x)
{
iteLine(\"output x : {0}\", x);
}
現(xiàn)在我們可以寫(xiě)成這樣:
public void test()
{
TheEvent testdel1 = del1;
testdel1(12);
}
或者將程序改寫(xiě)為:
delegate void TheEvent2(int a);
public void test2()
{
int a = 12;
TheEvent ev2 = delegate(ref int x)
{ iteLine(\"output x : {0}\", x); };
ev2( ref a);
}
比起1.2來(lái),delegate的可讀性更好,但是似乎沒(méi)有本質(zhì)的提高?慢著,讓我們看看下面的例子。
public static void test3()
{
int a = 12;
int y = 32;
TheEvent ev2 = delegate(ref int x)
{ iteLine(\"output x + y : {0}\", x + y); };
ev2( ref a);
}
注意,匿名函數(shù)中的內(nèi)容!x + y的值被正確的輸出了,而在1.2中,委托對(duì)于局部變量是沒(méi)有除參數(shù)外的訪問(wèn)方式的。這樣做有些什么好處呢?
讓我們看一個(gè)更加復(fù)雜的例子:
同比下滑了3.83%。但在這份并不光彩的成績(jī)單中 public static void test4()
{
int a = 12;
int y = 32;
TheEvent ev2 = delegate(ref int x)
{ iteLine(\"output x + y : {0}\", x + y); eep(100); };
//ev2(ref a);
IAsyncResult ar = ginInvoke(ref a,
delegate(IAsyncResult ar2)
{ite(\"Operation finished: {0} on thread ID:{1}, is pool: {2}\",Completed,tHashCode(), ThreadPoolThread);}
, null);
iteLine(\"do some other calculations while counter thread is working\");
ite(\"work status : {0} Main Thread ID:{1}, is pool: {2}\",
Completed,
tHashCode(),
ThreadPoolThread);
eep(500);
dInvoke(ref a, ar);
}
這個(gè)例子中使用了系統(tǒng)線程池對(duì)于任務(wù)進(jìn)行排隊(duì),適合于IO或者計(jì)算密集型的操作的時(shí)候。使用匿名委托最大的好處在于可以完整地克隆當(dāng)前運(yùn)行空間上下文的可用變量,雖然這可能從另一個(gè)層面上也增加了同步的復(fù)雜度,所謂有得必有失。查看本文來(lái)源
頸動(dòng)脈粥樣硬化有什么危害合肥治療包皮包莖費(fèi)用多少錢(qián)
江中黃芪生脈飲適用哪類(lèi)人
- 女子帶齊白石畫(huà)作去鑒寶,專(zhuān)家確認(rèn)為假,女子:我是齊白石孫女
- 男女比例導(dǎo)致失衡,可仍舊有不少人都想生男孩,這三個(gè)原因很真實(shí)
- 亞洲地區(qū)首款FcRn拮抗劑落地樂(lè)城 重癥肌無(wú)力治療有了新突破
- 河南省商品監(jiān)督管理局榮獲2021年度全省平安建設(shè)考評(píng)“優(yōu)秀”等次
- 福州五城區(qū)發(fā)布!事關(guān)所小學(xué)招生!
- 蔥姜蒜雖香,但不要亂放于!4種菜不適合放于蔥姜蒜,放于了味道會(huì)很怪
- 越窮越不要幫親戚打工,背后原因很現(xiàn)實(shí)又戳心!
- 裝修中開(kāi)工交底的素材有哪些?
- 奧賽康:母公司新藥ASKG315獲臨床試驗(yàn)申請(qǐng)受理通知書(shū)
- 河北七旬畫(huà)師“獨(dú)具特色”繪烙畫(huà):以火為墨 變幻無(wú)窮
- 給狗狗洗澡學(xué)問(wèn)大給比熊犬洗澡必須要注意哪位置
- 具有什么樣性格特點(diǎn)的金毛犬才是購(gòu)買(mǎi)首選位置