C#委托的常見模式及應(yīng)用舉例
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在C#編程中,委托是一種類型安全的函數(shù)指針,它允許將方法作為參數(shù)傳遞或賦值給變量。委托的靈活性和強(qiáng)大功能使得它在事件處理、異步編程、回調(diào)函數(shù)等場景中得到了廣泛應(yīng)用。下面將介紹C#中幾種常見的委托模式,并通過具體例子來說明它們的應(yīng)用。 1. 事件模式 事件模式是C#中最常見的委托應(yīng)用之一。通過定義事件,類可以通知其他對象當(dāng)某些特定事情發(fā)生時。事件通常使用委托類型來聲明,并且只允許在定義它的類內(nèi)部觸發(fā)。 // 聲明一個委托類型用于事件處理 public delegate void MyEventHandler(object sender, EventArgs e); // 定義一個包含事件的類 public class MyClass { // 聲明事件 public event MyEventHandler MyEvent; // 保護(hù)方法,用于觸發(fā)事件 protected virtual void OnMyEvent(EventArgs e) { MyEvent?.Invoke(this, e); } // 一個方法,當(dāng)某些條件滿足時觸發(fā)事件 public void DoSomething() { // ... 執(zhí)行一些操作 ... OnMyEvent(EventArgs.Empty); // 觸發(fā)事件 } } // 使用事件的客戶端代碼 class Program { static void Main(string[] args) { MyClass myObject = new MyClass(); myObject.MyEvent += new MyEventHandler(MyObject_MyEvent); // 訂閱事件 myObject.DoSomething(); // 執(zhí)行操作,觸發(fā)事件 } static void MyObject_MyEvent(object sender, EventArgs e) { Console.WriteLine("MyEvent was raised!"); // 事件處理邏輯 } } 2. 回調(diào)模式 回調(diào)模式允許將一個方法作為參數(shù)傳遞給另一個方法,并在適當(dāng)?shù)臅r候調(diào)用它。這在異步操作、定時器回調(diào)等場景中非常有用。 // 聲明一個委托用于回調(diào) public delegate void Callback(string result); // 一個執(zhí)行異步操作并回調(diào)的類 public class AsyncOperation { public void Start(Callback callback) { // 模擬異步操作(例如,使用Task或Thread) string result = "Operation completed"; callback?.Invoke(result); // 調(diào)用回調(diào)方法 } } // 使用回調(diào)的客戶端代碼 class Program { static void Main(string[] args) { AsyncOperation op = new AsyncOperation(); op.Start(OperationCompleted); // 開始異步操作并指定回調(diào)方法 } static void OperationCompleted(string result) { Console.WriteLine(result); // 處理異步操作的結(jié)果 } } 3. 多播委托 多播委托允許將一個委托變量關(guān)聯(lián)到多個方法,當(dāng)委托被調(diào)用時,所有關(guān)聯(lián)的方法都會按順序執(zhí)行。 // 聲明一個多播委托用于處理事件或回調(diào) public delegate void MultiCastDelegate(string message); class Program { static void Main(string[] args) { MultiCastDelegate mcd = MessageHandler1; // 關(guān)聯(lián)第一個方法 mcd += MessageHandler2; // 關(guān)聯(lián)第二個方法,形成多播委托 mcd("Hello, world!"); // 調(diào)用委托,兩個方法都會被執(zhí)行 } static void MessageHandler1(string message) { Console.WriteLine("Handler 1: " + message); } static void MessageHandler2(string message) { Console.WriteLine("Handler 2: " + message); } } class Program { static void Main(string[] args) { // 創(chuàng)建一個Action委托實例,它不接受任何參數(shù)且沒有返回值 Action myAction = null; // 使用+=運(yùn)算符來添加多個方法或Lambda表達(dá)式到多播委托 myAction += () => Console.WriteLine("Lambda expression 1 executed."); myAction += () => Console.WriteLine("Lambda expression 2 executed."); myAction += MethodToInvoke; // 添加一個方法到多播委托 // 調(diào)用多播委托,所有添加的方法或Lambda表達(dá)式都會被執(zhí)行 myAction(); // 也可以繼續(xù)添加更多的方法或Lambda表達(dá)式到多播委托 myAction += () => Console.WriteLine("Another lambda expression executed."); // 再次調(diào)用多播委托,新添加的方法或Lambda表達(dá)式也會被執(zhí)行 myAction(); } // 一個與Action委托簽名匹配的方法 static void MethodToInvoke() { Console.WriteLine("MethodToInvoke executed."); } } 4.委托作為返回值 // 聲明一個委托 public delegate string StringOperation(string input); class Program { static void Main(string[] args) { // 創(chuàng)建一個返回委托的方法實例 StringOperation operation = GetOperation(); // 調(diào)用返回的委托 string result = operation("Hello, world!"); Console.WriteLine(result); // 輸出: HELLO, WORLD! } // 一個方法,它返回一個委托實例,該實例指向ToUpper方法 static StringOperation GetOperation() { // 返回指向ToUpper方法的委托 return new StringOperation(string.ToUpper); } } 5.Lambda表達(dá)式和委托: Lambda表達(dá)式提供了一種簡潔的方式來創(chuàng)建匿名函數(shù),這些函數(shù)可以直接賦值給委托變量。Lambda表達(dá)式使得委托的使用更加靈活和方便。 // 聲明一個委托類型 public delegate int BinaryOp(int x, int y); class Program { static void Main(string[] args) { // 使用Lambda表達(dá)式創(chuàng)建一個BinaryOp委托實例 BinaryOp add = (x, y) => x + y; // 調(diào)用委托實例 int sum = add(5, 3); Console.WriteLine("Sum: " + sum); // 輸出: Sum: 8 } } 該文章在 2024/3/12 18:35:39 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |