久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

委托及.NET中的委托

180次閱讀
沒有評論

共計 2361 個字符,預計需要花費 6 分鐘才能閱讀完成。

概述

在.NET 框架中,委托是一種類型,它可以用于存儲對一個或多個方法的引用。委托可以被用作回調函數、事件處理程序和線程池中的異步任務等。.NET 中的委托與 C ++ 中的函數指針相似,但是它們支持多播、異步調用和可序列化等特性。

定義

在 C# 中,可以使用 delegate 關鍵字來定義委托類型。下面的代碼定義了一個委托類型,它可以引用一個具有兩個 int 類型參數和一個返回類型為 int 的方法:

“`

delegate int MyDelegate(int x, int y);

使用上述代碼定義的委托類型,可以在程序中創建一個委托實例,并將其關聯到一個方法上,如下所示:

MyDelegate del = new MyDelegate(MyMethod);

上述代碼中,MyMethod 是一個具有兩個 int 類型參數和一個返回類型為 int 的方法。通過將委托實例關聯到該方法上,可以通過委托調用該方法。

多播委托

.NET 中的委托支持多播,即一個委托實例可以關聯到多個方法。在多播委托中,調用委托實例時,它將按照添加委托的順序調用關聯的方法。下面的代碼將兩個具有相同簽名的方法關聯到一個委托實例上,并進行調用:

MyDelegate del1 = new MyDelegate(MyMethod1);

MyDelegate del2 = new MyDelegate(MyMethod2);

MyDelegate del = del1 + del2;

int result = del(1, 2);

在上述代碼中,通過使用 + 運算符將兩個委托實例關聯到一個委托實例上,然后調用該委托實例。在調用委托實例時,它將按照添加委托的順序調用關聯的方法。

異步委托

在.NET 中,委托也可以用于異步調用方法。異步委托可以將方法的執行延遲到后臺線程上,從而避免阻塞主線程。下面的代碼創建了一個異步委托實例,并將其關聯到一個方法上:

IAsyncResult result = del.BeginInvoke(1, 2, null, null);

在上述代碼中,通過調用委托實例的 BeginInvoke 方法,可以異步調用該方法。BeginInvoke 方法返回一個 IAsyncResult 接口實例,該實例表示異步調用的狀態信息。可以使用該接口實例等待異步調用完成,并獲取異步調用的結果。

委托鏈

在.NET 中,可以使用委托鏈來組合多個委托實例。委托鏈是一個有序的委托列表,它包含了多個委托實例,并按照它們添加到列表中的順序進行調用。下面的代碼創建了兩個委托實例,并將它們添加到一個委托鏈中:

Delegate del = Delegate.Combine(del1, del2);

在上述代碼中,使用 Delegate.Combine 方法將兩個委托實例添加到一個委托鏈中,并返回一個包含兩個委托實例的委托實例。

可序列化委托

在.NET 中,委托可以被序列化和反序列化,從而允許將它們作為參數傳遞給遠程方法或存儲到磁盤上。下面的代碼創建了一個可序列化委托實例,并將其保存到一個文件中:

FileStream stream = new FileStream(“delegate.bin”, FileMode.Create);

BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize(stream, del);

stream.Close();

在上述代碼中,通過調用 BinaryFormatter 對象的 Serialize 方法,可以將委托實例序列化到一個文件中。可以使用下面的代碼從文件中反序列化該委托實例:

FileStream stream = new FileStream(“delegate.bin”, FileMode.Open);

MyDelegate del = (MyDelegate)formatter.Deserialize(stream);

事件處理程序

在.NET 中,事件是由委托實現的。事件處理程序是一個具有特定簽名的方法,它被關聯到一個事件上,以響應該事件的發生。下面的代碼定義了一個事件,并關聯了一個事件處理程序到該事件上:

public class MyClass

{

public delegate void MyEventHandler(object sender, EventArgs e);

public event MyEventHandler MyEvent;

protected virtual void OnMyEvent(EventArgs e)

{

MyEventHandler handler = MyEvent;

if (handler != null)

{

handler(this, e);

}

}

}

public class Program

static void Main(string[] args)

MyClass obj = new MyClass();

obj.MyEvent += new MyClass.MyEventHandler(MyHandler);

obj.OnMyEvent(EventArgs.Empty);

static void MyHandler(object sender, EventArgs e)

Console.WriteLine(“MyHandler”);

在上述代碼中,定義了一個名為 MyEvent 的事件,并定義了一個名為 MyHandler 的事件處理程序。在 Main 方法中,將 MyHandler 方法關聯到 MyEvent 事件上,并通過調用 obj.OnMyEvent 方法觸發該事件。

本文介紹了.NET 中的委托,包括委托的定義、多播委托、異步委托、委托鏈、可序列化委托和事件處理程序等方面。委托是.NET 框架中重要的一種類型,它可以用于實現回調函數、事件處理程序和異步調用等功能,深入理解和掌握委托的使用對于.NET 開發人員非常重要。

丸趣 TV 網 – 提供最優質的資源集合!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2024-02-01發表,共計2361字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 社会| 巴里| 阳曲县| 广灵县| 山阴县| 营山县| 阜康市| 新营市| 桃园市| 年辖:市辖区| 开鲁县| 塔城市| 鹿泉市| 苗栗市| 桐乡市| 佛学| 开平市| 北票市| 沐川县| 昭苏县| 孟连| 天台县| 贡觉县| 张北县| 肥城市| 苗栗市| 峨山| 天台县| 牙克石市| 巴彦淖尔市| 西青区| 华池县| 囊谦县| 红河县| 青海省| 永康市| 龙江县| 西丰县| 荔波县| 大冶市| 保德县|