委託的發展 二

2022-04-06 15:33:07 字數 2351 閱讀 2351

嗯~~,其實在c#1看來委託語法看起來似乎並不太壞——語言以圍繞delegate.combine,delegate.remove以及委託例項的呼叫提供了語法糖。

表面上一切都在正常的軌道上,但是感覺不太對。

很難確切的描述c#1的委託建立表示式為什麼會令人不快,但他們確實如此。

在c#1中我們先寫好一連串事件處理程式,然後到處寫new。這顯得很多餘,很凌亂,因為事件本身已經指定了它要使用那個委託型別。

可能你會有不同意見,但是由於**中的文字量過多,會妨礙我們閱讀,並會使我們分心而忽略了真正該注意的**。

委託的協變性與逆變型,暫時先不所!

delegate

void testdelegate(string

x);public

class

snippet

}public

class

derived : snippet

}

如果這樣呼叫這個委託的話:

derived x = new

derived();

testdelegate test = new

testdelegate(x.testaction);

test.invoke(

"test

");

上面有兩個類,snippet與derived,並且derived繼承自snippet

在c#1中會輸出"hellow"。因為object引數那個方法與委託testdelegate不相容。

但在c#2中,它是相容的,他會輸出「hi」。由於是在另乙個派生的型別中宣告的,所以選中的是這個方法,。

在c#1,你只需要乙個委託,做一件非常非常小的事情,但也必須建立乙個完整的新方法。該方法表示的行為只和原始方法有關,但現在卻對整個類公開。

這一切都讓人嘔吐,所以c#2引入了  匿名方法

漂亮的解決了此問題。

按照不太正式的說法,匿名方法允許你指定乙個內聯委託例項的操作,作為建立委託例項表示式的一部分。

匿名方法還以 閉包 的形式提供了一些更加強大的行為。

與下面的action一起來做乙個例子吧

他的簽名非常簡單: 就是乙個無返回值的只有乙個引數的名叫action的泛型委託

public

delegate

void action(t obj);

使用匿名方法加action泛型委託來:輸出list的總和

actionint>> list = delegate (listx)

console.writeline(

"總和:

" +sum );

};

list.invoke(list); //執行

首先是匿名方法的語句:首先是delegate關鍵字,再是引數(如果有的話),隨後是乙個**塊,定義的對委託例項的操作。

看的出來這個匿名方法宣告了乙個int變數,然後迴圈list集合,累加到int變數上,然後輸出這個list總和。

action委託的返回型別是void,所以不必從匿名方法中返回任何東西。在某種情況下需要返回值怎麼辦呢?

使用.net2.0中的predicate委託型別。下面給出它的簽名:

public

delegate

bool predicate(t obj);

它是乙個predicate的泛型委託例項,返回值時bool型別,而且有乙個引數。

謂詞(predicate)通常用於過濾和匹配,例如,可以利用**清單來過濾乙個列表,使之只包含偶數元素。

來用一下,建立乙個predicate例項,其返回值指出傳入的實參是奇數還是偶數。

predicate iseven = delegate (intx);

console.writeline(iseven(

1));

console.writeline(iseven(

6));

新的語法(匿名方法),我想把它當做乙個普通方法來對待,並返回乙個恰當的值。你可能以為還要在靠近delegate關鍵字的地方宣告乙個返回型別,但那是沒有必要的。

因為編譯器只需檢查是否所有可能的返回值都相容於委託型別(編譯器會嘗試將匿名方法轉換成這個委託型別)宣告的返回型別。

c#2根本性的改變了委託的建立方式,這樣我們就能在。net framework的基礎上採取一種更函式化的程式設計風格。

與.net1.0/1.1相比,2.0有更多以委託作為引數的方法

2.0委託改動非常多甚至可以說是變革一樣。我講述了不到十分之一。

只是大體講了講委託的進化,而沒有說出他的內在變化,逆變型與協變性,包括閉包,捕獲變數等等。。。

太多了。。。以後再補充吧

委託的發展

下例演示了c 1.0到3.0委託的建立過程 public partial class delegate default2 system.web.ui.page del lambda表示式建立的委託 del del static void w public delegate void testdele...

委託的發展 一

zzz這幾天一直在看委託,一直從1.0的委託看到了3.0的蘭姆達表示式與linq。寫個部落格記錄一下,雖然委託的多種用法都沒有研究透徹,以後慢慢研究吧 一提起委託,如果你是c程式設計師,肯定會想到 函式指標 這個術語.實際上委託在某種程度上提供了間接的方法。換言之,不需要直接指定乙個要執行的行為,而...

委託發展史 三

通過c 2極大的簡化了委託的使用。如果僅僅是為了簡化事件的訂閱以及增強可讀性,這些技術確實已經足夠了。但是,c 2中的委託仍然過於臃腫 一頁充滿匿名方法的 讀起來真讓人難受,你也肯定不願意經常在乙個語句中放入多個匿名方法吧。c 3可以說是乙個工業革命。從許多方面lambda表示式都可以看做是c 2的...