<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 使用委托(C# 編程指南) [委托](https://msdn.microsoft.com/zh-cn/library/900fyy8e.aspx)是安全封裝方法的類型,類似于 C 和 C++ 中的函數指針。與 C 函數指針不同的是,委托是面向對象的、類型安全的和可靠的。委托的類型由委托的名稱確定。以下示例聲明名為 Del 的委托,該委托可以封裝采用[字符串](https://msdn.microsoft.com/zh-cn/library/362314fe.aspx)作為參數并返回 [void](https://msdn.microsoft.com/zh-cn/library/yah0tteb.aspx) 的方法: ``` public delegate void Del(string message); ``` 委托對象通常通過提供委托將封裝的方法的名稱或使用[匿名方法](https://msdn.microsoft.com/zh-cn/library/0yw3tz5k.aspx)構造。對委托進行實例化后,委托會將對其進行的方法調用傳遞到該方法。調用方傳遞到委托的參數將傳遞到該方法,并且委托會將方法的返回值(如果有)返回到調用方。這被稱為調用委托。實例化的委托可以按封裝的方法本身進行調用。例如: ``` // Create a method for a delegate. public static void DelegateMethod(string message) { System.Console.WriteLine(message); } ``` ``` // Instantiate the delegate. Del handler = DelegateMethod; // Call the delegate. handler("Hello World"); ``` 委托類型派生自 .NET Framework 中的 [Delegate](https://msdn.microsoft.com/zh-cn/library/system.delegate.aspx) 類。委托類型是[封裝的](https://msdn.microsoft.com/zh-cn/library/88c54tsw.aspx),它們不能派生出其他類,也不能從 [Delegate](https://msdn.microsoft.com/zh-cn/library/system.delegate.aspx) 派生出自定義類。由于實例化的委托是一個對象,因此可以作為參數傳遞或分配給一個屬性。這允許方法作為參數接受委托并在稍后調用委托。這被稱為異步回調,是在長進程完成時通知調用方的常用方法。當以這種方式使用委托時,使用委托的代碼不需要知道要使用的實現方法。功能類似于封裝接口提供的功能。 回調的另一個常見用途是定義自定義比較方法并將該委托傳遞到短方法。它允許調用方的代碼成為排序算法的一部分。以下示例方法使用 Del 類型作為參數: ``` public void MethodWithCallback(int param1, int param2, Del callback) { callback("The number is: " + (param1 + param2).ToString()); } ``` 然后,你可以將上面創建的委托傳遞到該方法: ``` MethodWithCallback(1, 2, handler); ``` 并將以下輸出接收到控制臺: The number is: 3 以抽象方式使用委托時,MethodWithCallback 不需要直接調用控制臺,記住,其不必設計為具有控制臺。 MethodWithCallback 的作用是簡單準備字符串并將字符串傳遞到其他方法。由于委托的方法可以使用任意數量的參數,此功能特別強大。 當委托構造為封裝實例方法時,委托將同時引用實例和方法。委托不知道除其所封裝方法以外的實例類型,因此委托可以引用任何類型的對象,只要該對象上有與委托簽名匹配的方法。當委托構造為封裝靜態方法時,委托僅引用方法。請考慮以下聲明: ``` public class MethodClass { public void Method1(string message) { } public void Method2(string message) { } } ``` 加上之前顯示的靜態 DelegateMethod,我們現在已有三個 Del 實例可以封裝的方法。 調用時,委托可以調用多個方法。這被稱為多播。若要向委托的方法列表(調用列表)添加其他方法,只需使用加法運算符或加法賦值運算符(“+”或“+=”)添加兩個委托。例如: ``` MethodClass 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 時,將按順序調用所有三個方法。如果委托使用引用參數,引用將按相反的順序傳遞到所有這三個方法,并且一種方法進行的任何更改都將在另一種方法上見到。當方法引發未在方法內捕獲到的異常時,該異常將傳遞到委托的調用方,并且不會調用調用列表中的后續方法。如果委托具有返回值和/或輸出參數,它將返回上次調用方法的返回值和參數。若要刪除調用列表中的方法,請使用減法運算符或減法賦值運算符(“+”或“+=”)。例如: ``` //remove Method1 allMethodsDelegate -= d1; // copy AllMethodsDelegate while removing d2 Del oneMethodDelegate = allMethodsDelegate - d2; ``` 由于委托類型派生自 **System.Delegate**,因此可以在委托上調用該類定義的方法和屬性。例如,若要查詢委托調用列表中方法的數量,你可以編寫: ``` int invocationCount = d1.GetInvocationList().GetLength(0); ``` 調用列表中具有多個方法的委托派生自 [MulticastDelegate](https://msdn.microsoft.com/zh-cn/library/system.multicastdelegate.aspx),該類屬于 **System.Delegate** 的子類。由于這兩個類都支持 **GetInvocationList**,因此在其他情況下,上述代碼也將產生作用。 多播委托廣泛用于事件處理中。事件源對象將事件通知發送到已注冊接收該事件的接收方對象。若要注冊一個事件,接收方需要創建用于處理該事件的方法,然后為該方法創建委托并將委托傳遞到事件源。事件發生時,源調用委托。然后,委托將對接收方調用事件處理方法,從而提供事件數據。給定事件的委托類型由事件源確定。有關詳細信息,請參閱[事件(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/awbftdfh.aspx)。 在編譯時比較分配的兩個不同類型的委托將導致編譯錯誤。如果委托實例是靜態的 **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. System.Console.WriteLine(d == f); } ``` ## 請參閱 [C# 編程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [委托(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/ms173171.aspx) [在委托中使用變體(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-cn/library/ms173174.aspx) [委托中的變體(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-cn/library/dd233060.aspx) [對 Func 和 Action 泛型委托使用變體(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-cn/library/dd465122.aspx) [事件(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/awbftdfh.aspx)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看