1. 程式人生 > >C#中委託(下)

C#中委託(下)

一、匿名方法

在使用委託的過程中不必定義僅由委託使用的方法,可以使用匿名方法。

宣告:類似於方法的宣告,不過引數列表前只有一個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;
   }
}