免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      C# 委托(delegate)

      委托是一種引用類型,表示對具有特定參數(shù)列表和返回類型的方法的引用。 在實例化委托時,你可以將其實例與任何具有相同簽名和返回類型的方法相關聯(lián)。 你可以通過委托實例調用方法。

      委托用于將方法作為參數(shù)傳遞給其他方法。 事件處理程序就是通過委托調用的方法。 你可以創(chuàng)建一個自定義方法,當發(fā)生特定事件時,某個類就可以調用你的方法。 下面的示例演示了一個委托聲明:

      public delegate int PerformCalculation(int x, int y);

      可將任何可訪問類或結構中與委托類型匹配的任何方法分配給委托。 該方法可以是靜態(tài)方法,也可以是實例方法。 此靈活性意味著你可以通過編程方式來更改方法調用,還可以向現(xiàn)有類中插入新代碼。

      備注

      在方法重載的上下文中,方法的簽名不包括返回值。 但在委托的上下文中,簽名包括返回值。 換句話說,方法和委托必須具有相同的返回類型。

      將方法作為參數(shù)進行引用的能力使委托成為定義回調方法的理想選擇。 可編寫一個比較應用程序中兩個對象的方法。 該方法可用在排序算法的委托中。 由于比較代碼與庫分離,因此排序方法可能更常見。

      對于類似的方案,已將函數(shù)指針添加到 C# 9,其中你需要對調用約定有更多的控制。 使用添加到委托類型的虛方法調用與委托關聯(lián)的代碼。 使用函數(shù)指針,可以指定不同的約定。

      委托具有以下屬性:

      • 委托類似于 C++ 函數(shù)指針,但委托完全面向對象,不像 C++ 指針會記住函數(shù),委托會同時封裝對象實例和方法。
      • 委托允許將方法作為參數(shù)進行傳遞。
      • 委托可用于定義回調方法。
      • 委托可以鏈接在一起;例如,可以對一個事件調用多個方法。
      • 方法不必與委托類型完全匹配。 有關詳細信息,請參閱使用委托中的變體。
      • 使用 Lambda 表達式可以更簡練地編寫內聯(lián)代碼塊。 Lambda 表達式(在某些上下文中)可編譯為委托類型。 若要詳細了解 lambda 表達式,請參閱 lambda 表達式。

      委托是安全封裝方法的類型,類似于 C 和 C++ 中的函數(shù)指針。 與 C 函數(shù)指針不同的是,委托是面向對象的、類型安全的和可靠的。 委托的類型由委托的名稱確定。 以下示例聲明名為 Del 的委托,該委托可以封裝采用字符串作為參數(shù)并返回 void 的方法:

      public delegate void Del(string message);

      委托對象通??刹捎脙煞N方式進行構造,一種是提供委托將封裝的方法的名稱,另一種是使用 lambda 表達式。 對委托進行實例化后,委托會將對其進行的方法調用傳遞到該方法。 調用方傳遞到委托的參數(shù)將傳遞到該方法,并且委托會將方法的返回值(如果有)返回到調用方。 這被稱為調用委托。 實例化的委托可以按封裝的方法本身進行調用。 例如:

      // Create a method for a delegate.public static void DelegateMethod(string message){ Console.WriteLine(message);}// Instantiate the delegate.Del handler = DelegateMethod;// Call the delegate.handler(“Hello World”);

      委托類型派生自 .NET 中的 Delegate 類。 委托類型是密封的,它們不能派生自 Delegate,也不能從其派生出自定義類。 由于實例化委托是一個對象,因此可以將其作為參數(shù)傳遞或分配給屬性。 這允許方法接受委托作為參數(shù)并在稍后調用委托。 這被稱為異步回調,是在長進程完成時通知調用方的常用方法。 當以這種方式使用委托時,使用委托的代碼不需要知道要使用的實現(xiàn)方法。 功能類似于封裝接口提供的功能。

      回調的另一個常見用途是定義自定義比較方法并將該委托傳遞到短方法。 它允許調用方的代碼成為排序算法的一部分。 以下示例方法使用 Del 類型作為參數(shù):

      public static void MethodWithCallback(int param1, int param2, Del callback){ callback(“The number is: ” + (param1 + param2).ToString());}

      然后,你可以將上面創(chuàng)建的委托傳遞到該方法:

      MethodWithCallback(1, 2, handler);

      并將以下輸出接收到控制臺:

      The number is: 3

      以抽象方式使用委托時,MethodWithCallback 不需要直接調用控制臺,記住,其不必設計為具有控制臺。 MethodWithCallback 的作用是簡單準備字符串并將字符串傳遞到其他方法。 由于委托的方法可以使用任意數(shù)量的參數(shù),此功能特別強大。

      當委托構造為封裝實例方法時,委托將同時引用實例和方法。 委托不知道除其所封裝方法以外的實例類型,因此委托可以引用任何類型的對象,只要該對象上有與委托簽名匹配的方法。 當委托構造為封裝靜態(tài)方法時,委托僅引用方法。 請考慮以下聲明:

      public class MethodClass{ public void Method1(string message) { } public void Method2(string message) { }}

      加上之前顯示的靜態(tài) DelegateMethod,我們現(xiàn)在已有三個 Del 實例可以封裝的方法。

      調用時,委托可以調用多個方法。 這被稱為多播。 若要向委托的方法列表(調用列表)添加其他方法,只需使用加法運算符或加法賦值運算符(“+”或“+=”)添加兩個委托。 例如:

      var obj = new MethodClass();Del d1 = obj.Method1;Del d2 = obj.Method2;Del d3 = DelegateMethod;//Both types of assignment are valid.Del allMethodsDelegate = d1 + d2;allMethodsDelegate += d3;

      此時,allMethodsDelegate 的調用列表中包含三個方法,分別為 Method1、Method2 和 DelegateMethod。 原有的三個委托(d1、d2 和 d3)保持不變。 調用 allMethodsDelegate 時,將按順序調用所有三個方法。 如果委托使用引用參數(shù),引用將按相反的順序傳遞到所有這三個方法,并且一種方法進行的任何更改都將在另一種方法上見到。 當方法引發(fā)未在方法內捕獲到的異常時,該異常將傳遞到委托的調用方,并且不會調用調用列表中的后續(xù)方法。 如果委托具有返回值和/或輸出參數(shù),它將返回上次調用方法的返回值和參數(shù)。 若要刪除調用列表中的方法,請使用減法運算符或減法賦值運算符(- 或 -=)。 例如:

      //remove Method1allMethodsDelegate -= d1;// copy AllMethodsDelegate while removing d2Del oneMethodDelegate = allMethodsDelegate – d2;

      由于委托類型派生自 System.Delegate,因此可以在委托上調用該類定義的方法和屬性。 例如,若要查詢委托調用列表中方法的數(shù)量,你可以編寫:

      int invocationCount = d1.GetInvocationList().GetLength(0);

      調用列表中具有多個方法的委托派生自 MulticastDelegate,該類屬于 System.Delegate 的子類。 由于這兩個類都支持 GetInvocationList,因此在其他情況下,上述代碼也將產生作用。

      多播委托廣泛用于事件處理中。 事件源對象將事件通知發(fā)送到已注冊接收該事件的接收方對象。 若要注冊一個事件,接收方需要創(chuàng)建用于處理該事件的方法,然后為該方法創(chuàng)建委托并將委托傳遞到事件源。 事件發(fā)生時,源調用委托。 然后,委托將對接收方調用事件處理方法,從而提供事件數(shù)據(jù)。 給定事件的委托類型由事件源確定。 有關詳細信息,請參閱事件。

      在編譯時比較分配的兩個不同類型的委托將導致編譯錯誤。 如果委托實例是靜態(tài)的 System.Delegate 類型,則允許比較,但在運行時將返回 false。 例如:

      delegate void Delegate1();delegate void Delegate2();static void method(Delegate1 d, Delegate2 e, System.Delegate f){ // Compile-time error. //Console.WriteLine(d == e); // OK at compile-time. False if the run-time type of f // is not the same as that of d. Console.WriteLine(d == f);}

      鄭重聲明:本文內容及圖片均整理自互聯(lián)網,不代表本站立場,版權歸原作者所有,如有侵權請聯(lián)系管理員(admin#wlmqw.com)刪除。
      用戶投稿
      上一篇 2022年6月24日 06:02
      下一篇 2022年6月24日 06:02

      相關推薦

      • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應該怎么發(fā))

        對于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經營一個朋友圈,有的微商看起來逼格滿滿,實際效果也不錯;而有的卻動都不動就被屏蔽甚至拉黑…

        2022年11月27日
      • 存儲過程語法(sql server存儲過程語法)

        今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關注本站,現(xiàn)在開始吧! oracle存儲過程基本語法…

        2022年11月26日
      • 《寶可夢朱紫》夢特性怎么獲得?隱藏特性獲取方法推薦

        寶可夢朱紫里有很多寶可夢都是擁有夢特性會變強的寶可夢,很多玩家不知道夢特性怎么獲得,下面就給大家?guī)韺毧蓧糁熳想[藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

        2022年11月25日
      • 《寶可夢朱紫》奇魯莉安怎么進化?奇魯莉安進化方法分享

        寶可夢朱紫中的奇魯莉安要怎么進化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧糁熳掀骠斃虬策M化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進化方法分享 奇魯莉安…

        2022年11月25日
      • 事件營銷案例

        篇一成功營銷案例小故事成功銷售案例小故事篇1模仿 一個人想做一套家具,就走到樹林里砍倒一棵樹,并動手把它鋸成木板這個人鋸樹的時候,把樹干的一頭擱在樹墩上,自己騎在樹干上還往鋸開的縫…

        2022年11月24日
      • 銳龍97900x參數(shù)規(guī)格跑分評測 銳龍97900x屬于什么檔次

        銳龍9 7900X是銳龍7000系列處理器中性能頂尖的型號之一,它采用了這一代標配的zen4架構和5nm制程工藝,那么它具體的參數(shù)跑分如何,在電腦上世紀發(fā)揮怎么樣呢,下面就來看看銳…

        2022年11月24日
      • 《寶可夢朱紫》暴飛龍怎么抓?暴飛龍獲得方法

        寶可夢朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實獲得方法很簡單,暴飛龍直接是沒得抓的,需要玩家從寶貝龍進化得到,下面一起來看一下寶可夢朱紫暴飛龍獲得…

        2022年11月23日
      • 《寶可夢朱紫》布土撥怎么進化?布土撥進化方法介紹

        寶可夢朱紫中,不同的寶可夢有不同的進化方法,其中布土撥的進化方法是比較特殊的。很多玩家不知道寶可夢朱紫布土撥怎么進化,下面就帶來寶可夢朱紫布土撥進化方法介紹,一起來看看吧,希望能幫…

        2022年11月23日
      • 《寶可夢朱紫》薄荷怎么獲得?薄荷獲得方法

        寶可夢朱紫中薄荷有改變寶可夢的屬性或性格等效果,很多玩家想知道寶可夢朱紫薄荷怎么獲得,下面就帶來寶可夢朱紫薄荷獲得方法,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 薄荷獲得方法…

        2022年11月23日
      • 《寶可夢朱紫》怎么交換精靈?交換精靈方法一覽

        寶可夢朱紫中玩家可以和好友或者npc進行交換寶可夢獲得自己沒有的寶可夢,很多玩家想知道寶可夢朱紫怎么交換精靈,下面就帶來寶可夢朱紫交換精靈方法一覽,感興趣的小伙伴不要錯過,希望能幫…

        2022年11月23日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時間:周一至周五,10:30-18:30,節(jié)假日休息