C#中委託(下)
阿新 • • 發佈:2019-02-16
一、匿名方法
在使用委託的過程中不必定義僅由委託使用的方法,可以使用匿名方法。
宣告:類似於方法的宣告,不過引數列表前只有一個delegate關鍵字,沒有其他修飾符、返回值型別和方法名。例如:delegate (int a){ }
下面給出示例:
// 聲明瞭一個有兩個 string型別的引數的委託,使用匿名方法替代了方法名例項化委託 Action<string,string> a = delegate (string str,string str1) { // 由於該型別委託沒有返回值,所以不需要 return }; // 聲明瞭一個 string型別的引數和 string型別返回值的委託,使用匿名方法替代了方法名例項化委託 Func<string,string> b = delegate (string str) { return "匿名方法"; };
注意:
1、匿名方法沒有方法名和返回值宣告,使用匿名方法時,要根據委託型別看是否需要返回值;
2、匿名方法可以減少程式碼的使用,但是並沒有加快程式碼的執行速度,編譯器仍定義了一個自動指定名稱的方法。
二、lambda 表示式
可以使用lambda表示式來代替匿名方法的使用,他比匿名方法更簡單。例如:a =>{ }
lambda 表示式與 匿名方法的區別
1、lambda 表示式沒有 delegate 關鍵字,使用 => 來指向方法體,當只有一個引數的時候可以不使用括號;
2、lambda 表示式 的引數可以不用宣告型別。
下面給出示例:
三、閉包//匿名方法 Func<string,string> c = delegate (string str) { return "匿名方法"; }; //lambda 表示式 Func<string,string> d = str => { return "匿名方法"; }; //匿名方法1 Func<string,string,int> c1 = delegate (string a,string b) { return int.Parse(a+b); }; //lambda 表示式1 Func<string,string,int> d1 = (a,b) => { return int.Parse(a+b); };
閉包的定義:通過 lambda 表示式可以訪問 lambda 表示式外部的變數。
注意:如果 lambda 表示式內部用到了外部的變數,當外部變數的值改變時,lambda 表示式裡的值也會相應改變。
原理:在編譯器編譯 lambda 表示式的時候會建立一個匿名類,他有一個建構函式來訪問外部的變數,還有一個匿名方法,其返回值,引數,實現由 lambda 表示式定義。當使用 lambda 表示式例項化的委託時,會建立該匿名類的一個例項並使用外部的變數來初始化,並訪問該類的匿名方法。
下面給出示例:
public class MyClass { // 宣告一個欄位 a static int a = 1; // 宣告一個委託使用 lambda 表示式例項化,返回值是引數與 a 的和 Func<int,int> dele = para => { return para + a; }; } // 這裡是匿名類(名字是隨便定義的) public class VarClass { // 欄位 int someValue; // 自定義建構函式,引數的個數與型別與委託定義的引數個數和型別一致 public VarClass(int someValue) { this.someValue = someValue; } // 匿名方法 public int VarMethod(int para) { return para + this.someValue; } }