.Net中的委托
一、什么是委托?
委托類型聲明的格式如下:
??//申明委托???public?delegate?void?TestDelegate(string?message);
1.delegate 關(guān)鍵字用于聲明一個引用類型,該引用類型可用于封裝命名方法或匿名方法。委托是類型安全和可靠的。
2.委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。委托方法的使用可以像其他任何方法一樣,具有參數(shù)和返回值,如下面的示例所示:
3.委托具有以下特點:
-
委托類似于 C++ 函數(shù)指針,但它是類型安全的。
-
委托允許將方法作為參數(shù)進行傳遞。
-
委托可用于定義回調(diào)方法。
-
委托可以鏈接在一起;例如,可以對一個事件調(diào)用多個方法。
-
方法不需要與委托簽名精確匹配。有關(guān)更多信息,請參見協(xié)變和逆變。
-
C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數(shù)傳遞,以代替單獨定義的方法。
二、委托在.net中的幾種寫法
1.在.net 1.0中的寫法如下:
View Code ?//申明委托簽名?public?delegate?void?TestDelegate(string?message);
//委托的匹配方法
??public?static?void?TestMethod(string?msg)
????????{
????????????Console.WriteLine(string.Format(".net?委托:{0}",?msg));
????????}
??static?void?Main(string[]?args)
????????{
????????????#region?.net?1.x寫法
????????????TestDelegate?dele1?=?TestMethod;
????????????dele1(".net?1.x寫法");
????????????TestDelegate?dele2?=?new?TestDelegate(TestMethod);
????????????dele2(".net?1.x寫法");
????????????#endregion
?????}
2.在.net 2.0中的寫法,.net 2.0中重要的是引入了匿名方法,? 當然也可以使用.net1.0中的寫法。
View Code #region?.net2.x寫法
static?void?Main(string[]?args)
{
??//申明委托對象的時候直接指向一個方法(匿名)的實現(xiàn)
???TestDelegate?dele3?=?delegate(string?msg)
?????????????{
?????????????????Console.WriteLine(string.Format(".Net委托:{0}",?msg));
?????????????};
?????????????dele3(".net2.x寫法--匿名方法");
}
3.在.net 3.x中的寫法,引入Lambda 表達式,我們來看微軟給Lambda 表達式的定義:??????
“Lambda 表達式”是一個匿名函數(shù),它可以包含表達式和語句,并且可用于創(chuàng)建委托或表達式樹類型。
所有 Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。該 Lambda 運算符的左邊是輸入?yún)?shù)(如果有),右邊包含表達式或語句塊。Lambda 表達式 x => x * x 讀作“x goes to x times x”。
View Code ??//該?Lambda?運算符的左邊是輸入?yún)?shù)(如果有),右邊包含表達式或語句塊
????TestDelegate?dele4?=?msg?=>?Console.WriteLine(string.Format(".Net委托:{0}",?msg));
????dele4(".net?3.x寫法中可以引入Lambda?表達式");
三、委托的應(yīng)用場景:
只調(diào)用單個方法時.
當一個類需要方法說明的多重執(zhí)行時.
期望使用靜態(tài)方法執(zhí)行規(guī)范時.
期望得到一個類似事件的模式時.
調(diào)用者無需知道無需獲取定義方法的對象時
只想給少數(shù)既定組件分發(fā)執(zhí)行規(guī)范時.
想要簡單的組成結(jié)構(gòu)時.
?
總結(jié)
- 上一篇: Windows7中Prefetch预读文
- 下一篇: linux下开机启动oracle