嗯~~,其實在c#1看來委託語法看起來似乎並不太壞——語言以圍繞delegate.combine,delegate.remove以及委託例項的呼叫提供了語法糖。
表面上一切都在正常的軌道上,但是感覺不太對。
很難確切的描述c#1的委託建立表示式為什麼會令人不快,但他們確實如此。
在c#1中我們先寫好一連串事件處理程式,然後到處寫new。這顯得很多餘,很凌亂,因為事件本身已經指定了它要使用那個委託型別。
可能你會有不同意見,但是由於**中的文字量過多,會妨礙我們閱讀,並會使我們分心而忽略了真正該注意的**。
委託的協變性與逆變型,暫時先不所!
delegatevoid testdelegate(string
x);public
class
snippet
}public
class
derived : snippet
}
如果這樣呼叫這個委託的話:
derived x = newderived();
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的泛型委託
publicdelegate
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委託型別。下面給出它的簽名:
publicdelegate
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的...