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