委託,匿名方法, 表示式

2021-08-25 10:30:56 字數 1692 閱讀 3172

1、委託:委託本質上就是函式指標,但由於指標過於靈活,因此在很多語言中都採用了更加安全的替代型別,比如delphi的物件方法和c#的委託.委託使得方法可以做為引數進行傳遞,極大的方便了程式的處理(事件本質上就是委託,是委託的一種典型應用)。使用委託的最大好處一是可以實現演算法上的分離,二是可以實現一定程度上的動態聯編(即物件導向中的所謂多型),對於演算法上的分離,在物件導向的模式設計中,策略模式是比較典型的,其實我們使用委託照樣可以在一定程度上模仿其功能,實際上使用策略模式在很多時候還不如委託來得簡單有效,而且在效能上也比委託差些。由於委託本身也是一種規範和標準,因此在這種層面上和抽象類,介面一樣具有多型性。當然,委託的這種多型性也必須遵循程式語言的繼承規範:子類例項可以賦給父類變數,反之則不允許。根據這種規範,站在委託的角度,委託具有返回值協變,引數抗變的特性。即實際委託呼叫的返回值只能是委託定義的返回值型別的子類,實際呼叫方法的引數必須是委託定義中的引數的父類。

如:public delegatea compare(type1 v);

實際呼叫的方法:public b compareinstance(type2 v).根據繼承規範,type2必須是type1的父類,而b必須是a的子類.

2、匿名方法:在給委託變數例項化的時候,一般是提供乙個有名的方法,如:compare _compare=compareinstance;但現在c#提供了一種匿名方法,匿名方法是乙個**塊,本質上與命名方法沒有什區別,但與命名方法相比,提供了如下兩個便利:1是書寫上,使得委託變數可以與例項化方法在一起,這樣有利於理解;2是匿名方法可以訪問匿名方法**塊以外的變數,這點上相對於命名方法要靈活很多,這是優點,也是缺點,缺點是其破壞了**的封裝性,當然,你把匿名方法與其所在的**模組看作是乙個整體(如果從邏輯上來講也確實是個整體),那麼這個缺點就無所謂了。下面是簡單的例子:

int thetest=0;

compare _compare = delegate(int v)

_compare(2);//呼叫.

匿名方法使用上的限制主要是程式控制方面的,比如不能跳轉到匿名方法塊外部,也不能從外部跳轉到匿名方法塊內部等。由於這種匿名**塊並不能復用,因此我覺得匿名方法的實際應用價值並不大,何況還可以用λ表示式替代。

3、λ表示式:λ表示式的作用其實跟匿名方法沒什麼區別,可以將λ表示式理解成匿名方法的一種簡潔表達方式。

匿名方法和λ表示式的引入,主要作用在於可以使得程式的表達更加簡潔,但把這兩個東西作為c#語言乙個新的特徵就有那麼一點王婆賣瓜的味道了.其實所謂的范型、匿名方法等很多所謂的c#的新東西都是從c++中拿來重新包裝一下而已,思想上並沒有本質的進步(題外話:我們中國程式設計師很多時候都是被這種似是而非的新技術驅趕著跑)。

下面是乙個簡單的測試例子:

private void button1_click(object sender, eventargs e)

;//var depts2 = teachers.select(bb).distinct();

#endregion

//使用λ表示式,非簡潔方式

//var depts2 = teachers.select((t) => ).distinct();

//等價於

var depts2 = teachers.select(t=>t._deptid).distinct();

foreach (var el in depts2)

}private int funcb(teacher obj)

委託,匿名方法, 表示式

1 委託 委託本質上就是函式指標,但由於指標過於靈活,因此在很多語言中都採用了更加安全的替代型別,比如delphi的物件方法和c 的委託.委託使得方法可以做為引數進行傳遞,極大的方便了程式的處理 事件本質上就是委託,是委託的一種典型應用 使用委託的最大好處一是可以實現演算法上的分離,二是可以實現一定...

委託,匿名方法, 表示式

1 委託 委託本質上就是函式指標,但由於指標過於靈活,因此在很多語言中都採用了更加安全的替代型別,比如delphi的物件方法和c 的委託.委託使得方法可以做為引數進行傳遞,極大的方便了程式的處理 事件本質上就是委託,是委託的一種典型應用 使用委託的最大好處一是可以實現演算法上的分離,二是可以實現一定...

Lambda表示式 匿名方法 委託

lambda表示式 匿名方法 委託 16 9 2017 代替匿名方法的簡單演示 using system using system.collections.generic using system.linq using system.text using system.threading.tasks...