如何在 C# 中使用 委托
委托是一個類型安全的函數指針,它可以引用與委托具有相同簽名的方法,你可以利用 委托 實現事件或者回調函數,多播委托 可以引用一個或者多個具有相同簽名的方法。
理解 委托
本質上來說,委托包含了一個對方法的引用,概念上和 C ++ 上的函數指針是一樣的,唯一不一樣的是 C# 中的 委托 是類型安全的,你可以將方法作為參數傳給 委托,而從讓 委托 持有對方法的引用,委托常用于定義成 回調函數 和 事件處理,一般用 delegate 關鍵詞去聲明,可以將 delegate 定義成 類平級,也可以嵌套在 類中。
使用 委托 一般有以下三個步驟:
初始化 declaration
實例化 instantiation
調用 ? invocation
委托簽名的語法格式如下:
delegate?result-type?identifier?([parameters])下面的代碼展示了如何套用語法格式實現一個委托。
public?delegate?void?MyDelegate(string?text);上面的代碼可以看出,委托的名字為 MyDelegate, 它的返回值為 void,并且接收一個 string 類型的參數,這就意味著,委托需指向的方法也必須和這個委托具有相同的簽名,上面只是 委托 的一個定義,要使用的話,還得塞入一個同簽名的方法,代碼如下。
MyDelegate?d?=?new?MyDelegate(ShowText);一旦定義完成并且成功實例化后,接下來就可以執行這個委托了,如下代碼所示:
d("Hello?World...");這里的 d 就是 委托實例,除了上面這種調用方法,還可以調用委托的 Invoke() 來執行委托所引用的方法。
d.Invoke("Hello?World...");如果你有一個方法接收兩個參數作為入參,兩個參數的累計值作為方法的返回值,那這種委托該怎么定義呢?完整代碼如下:
using?System;namespace?Delegates {public?delegate?int?MyDelegate(int?x,?int?y);class?Program{static?int?Sum(int?x,?int?y){return?x?+?y;}static?void?Main(){MyDelegate?d?=?new?MyDelegate(Sum);???????????int?result?=?d.Invoke(12,?15);Console.WriteLine(result);Console.ReadLine();}} }?委托實踐
首先看下完整的代碼清單。
using?System; namespace?Delegates {public?delegate?void?MyDelegate(string?text);class?Program{public?static?void?ShowText(string?text){Console.WriteLine(text);}static?void?Main(){MyDelegate?d?=?new?MyDelegate(ShowText);d("Hello?World...");Console.ReadLine();}} }值得注意的是,你可以使用 + 號將多個對象賦給一個 委托實例,這就讓原來的 普通委托 成為了 多播委托,除了 + 號,也可以使用 Delegate 下的靜態 Combine 方法 來合并多個 delegate 實例,有一點要注意,運行時委托會在內部維護了一個 list 集合來存放待執行的方法,下面的代碼展示了如何使用 Combine 來合并多個 委托實例。
myDelegate?d1?=?new?myDelegate(Method1); myDelegate?d2?=?new?myDelegate(Method2); myDelegate?multicastDelegate?=?(myDelegate)Delegate.Combine(d1,?d2); multicastDelegate.Invoke();所謂的 多播委托 就是一個委托可以指向多個方法,值得注意的是,委托實例是不可變的,這就意味著從內部list 中 新增 或者 刪除 一個委托實例,將會創建一個新的委托實例,從而變相的實現 list 的變更。
多播委托實踐
下面的代碼片段展示了一個多播委托,要注意這里的 委托實例 的用法,這里我使用了 += 操作符 實現將 多個具有相同簽名的方法灌入到 委托實例 中。
using?System; namespace?Delegates {public?delegate?void?MyDelegate();class?Program{public?static?void?Method1(){Console.WriteLine("Inside?Method1...");}public?static?void?Method2(){Console.WriteLine("Inside?Method2...");}static?void?Main(){MyDelegate?d?=?null;d?+=?Method1;d?+=?Method2;d.Invoke();Console.ReadLine();}} }事件驅動編程 模式中會大量使用委托,因為 委托 不需要關心它是被哪一個實例對象所引用,而只需關心它所引用的方法是否具有相同簽名,合理的使用委托,可以提高你的代碼復用 并且提升代碼設計的靈活性,更多關于 委托的知識,可參考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/
譯文鏈接:https://www.infoworld.com/article/2996770/how-to-work-with-delegates-in-csharp.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的如何在 C# 中使用 委托的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Abp vNext 后台作业hangfi
- 下一篇: 调试实战 | 通过转储文件分析程序无响应