狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#委托的常見模式及應用舉例

admin
2024年3月11日 16:37 本文熱度 628

在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)

      {

          // 模擬異步操作(例如,使用TaskThread

          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 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved