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

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

每個.NET開發都應掌握的C#委托事件知識點

admin
2023年8月31日 18:41 本文熱度 574

C#作為.NET開發的核心語言之一,提供了豐富的特性來支持面向對象編程和事件驅動的模型。其中,委托和事件是C#中不可或缺的關鍵概念,每個.NET開發者都應該深入理解它們的作用和用法。委托和事件密不可分,所以本文將委托和事件的知識點一起介紹,并通過一些示例來幫助開發者更好地掌握這些重要的概念。

一、委托

委托讓方法引用的靈活利用

1、委托的定義與使用

委托是一種數據類型,用于持有對一個或多個方法的引用。通過委托,你可以將方法作為參數傳遞給其他方法,實現回調機制,實現方法的動態調用。使用`delegate`關鍵字可以聲明委托類型,并創建委托實例來綁定具體方法。

using System;//定義一個委托delegate int CalculatorDelegate(int a, int b);class Calculator{    public int Add(int a, int b)    {        return a + b;    }    public int Subtract(int a, int b)    {        return a - b;    }}class Program{    static void Main(string[] args)    {        Calculator calculator = new Calculator();        // 聲明委托實例,并綁定到 Add 方法        CalculatorDelegate funDelegate = new CalculatorDelegate(calculator.Add);        // 使用委托調用方法        int result = funDelegate (5, 2);        Console.WriteLine($"5 + 2 = {result}");        // 將委托重新綁定到 Subtract 方法        funDelegate = calculator.Subtract;        // 使用委托調用不同的方法        result = funDelegate(8, 6);        Console.WriteLine($"8 - 6 = {result}");    }}

使用try.dot.net的測試結果:

2、委托的多播

委托不僅可以持有單個方法的引用,還可以用于多播,即將多個方法綁定到同一個委托實例。多播委托允許按順序調用這些方法,實現一次觸發多個方法的功能。

using System;
delegate void MyDelegate(); // 定義委托
class EventPublisher
{
    private MyDelegate eventHandlers; // 多播委托實例
    public void AddHandler(MyDelegate handler)
    {
        eventHandlers += handler; // 添加委托方法到多播鏈
    }
    public void RemoveHandler(MyDelegate handler)
    {
        eventHandlers -= handler; // 從多播鏈中移除委托方法
    }
    public void RaiseEvent()
    {
        Console.WriteLine("事件發布者正在引發事件...");
        eventHandlers?.Invoke(); // 調用多播鏈中的委托方法
    }
}
class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        // 添加多個事件處理程序到多播鏈
        publisher.AddHandler(Method1);
        publisher.AddHandler(Method2);
        publisher.AddHandler(Method3);
        // 觸發事件,調用多播鏈中的所有方法
        publisher.RaiseEvent();
        // 移除一個事件處理程序
        publisher.RemoveHandler(Method2);
        // 再次觸發事件
        publisher.RaiseEvent();
        Console.ReadKey();
    }
    static void Method1()
    {
        Console.WriteLine("方法1運行.");
    }
    static void Method2()
    {
        Console.WriteLine("方法2運行.");
    }
    static void Method3()
    {
        Console.WriteLine("方法3運行.");
    }
}

輸出結果:

3、 匿名方法與Lambda表達式

C# 2.0 引入了匿名方法,允許在沒有顯示聲明方法的情況下傳遞代碼塊作為委托參數。而Lambda表達式則是C# 3.0 的新特性,提供了更簡潔的語法來創建委托實例。.NET的ORM框架EF中有了Lambda表達式方便多了。

進化:委托-->匿名方法-->Lambda

案例:下面案例是委托匿名方法和Lambda表達式三種使用案例

using System;
using System.Linq;
delegate int MathOperation(int a, int b);
class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Subtract(int a, int b)
    {
        return a - b;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Calculator calculator = new Calculator();
        // 1、使用委托和實例方法 Add
        MathOperation operation1 = calculator.Add;
        int result1 = operation1(10, 5);
        Console.WriteLine($"用委托方法計算: 10 + 5 = {result1}");
        // 2、使用匿名方法進行減法運算
        //MathOperation  operation2 = delegate (int a, int b)
        Func<int,int,int> operation2 = delegate (int a, int b)//內置Func
        {
            return a - b;
        };
        int result2 = operation2(15, 7);
        Console.WriteLine($"用匿名方法計算: 15 - 7 = {result2}");
        // 3、使用 Lambda 表達式進行乘法運算
        //MathOperation operation3 = (a, b) => a * b;//委托變量
        Func<int,int,int> operation3 = (a, b) => a * b;//內置Func
        int result3 = operation3(8, 6);
        Console.WriteLine($"用Lambda計算: 8 * 6 = {result3}");
        Console.ReadKey();
    }
}

效果如下:

4、委托的BeginInvoke方法實現異步

委托的 BeginInvoke 方法和 EndInvoke 方法可以實現異步執行委托方法。這允許委托的方法在后臺線程中執行,而不會阻塞當前線程。小編在之前的webform開發中遇到下載進度條卡死的問題就是用它解決的。

案例:

using System;using System.Threading;
delegate void PrintDelegate(string message);class Program{    static void PrintMessage(string message)    {        for (int i = 0; i < 10000; i++)        {            Console.WriteLine(message);        }    }    static void Main(string[] args)    {        PrintDelegate print = PrintMessage;        // 使用委托的 BeginInvoke 方法來異步執行方法        IAsyncResult result = print.BeginInvoke("執行異步方法!", null, null);        // 使用委托的 EndInvoke 方法獲取異步操作結果        print.EndInvoke(result);//這里不會卡死        Console.WriteLine("Begin 后的方法");        Console.ReadKey();    }}//由于控制臺不支持展示,大家可以自己研究一下。


二、事件

事件對象之間的松耦合通信

1、事件的定義與聲明

事件是委托的一種特殊應用,用于實現發布-訂閱模型。使用event關鍵字可以聲明事件,并指定事件委托的類型。事件允許對象通知其他對象在特定情況下執行操作,實現松耦合的通信機制。

 //聲名 public event TemperatureChangeHandler TemperatureChanged;

2、事件的訂閱與發布

訂閱事件的類(事件訂閱者)可以將其方法綁定到事件上,以便在事件觸發時執行操作。事件的持有者(事件發布者)在適當的時機觸發事件,調用事件委托,從而通知所有訂閱者執行相應的操作。

案例:

using System;
// 定義事件發布者類class EventPublisher{    // 聲明事件委托    public event EventHandler<string> MessageSent;    // 觸發事件的方法    public void SendMessage(string message)    {        Console.WriteLine($"發送消息:{message}");        OnMessageSent(message);    }    // 觸發事件的保護方法    protected virtual void OnMessageSent(string message)    {        MessageSent?.Invoke(this, message); // 調用事件    }}
// 定義事件訂閱者類class EventSubscriber{    public void Subscribe(EventPublisher publisher)    {        // 訂閱事件        publisher.MessageSent += HandleMessageSent;    }    public void Unsubscribe(EventPublisher publisher)    {        // 取消訂閱事件        publisher.MessageSent -= HandleMessageSent;    }    // 事件處理方法    private void HandleMessageSent(object sender, string message)    {        Console.WriteLine($"接收到消息:{message}");    }}
class Program{    static void Main(string[] args)    {        EventPublisher publisher = new EventPublisher();        EventSubscriber subscriber1 = new EventSubscriber();        EventSubscriber subscriber2 = new EventSubscriber();        // 訂閱事件        subscriber1.Subscribe(publisher);        subscriber2.Subscribe(publisher);        // 發布事件        publisher.SendMessage("你好,訂閱者們!");        Console.WriteLine("取消一個訂閱者的訂閱...");        // 取消訂閱一個訂閱者        subscriber1.Unsubscribe(publisher);        // 發布事件        publisher.SendMessage("再次打個招呼!");
       Console.ReadKey();    }}

輸出

3、事件的安全性與封裝

事件提供了一種封裝機制,使得事件只能被持有者觸發,而不會被外部隨意調用。這樣可以確保事件只在控制的范圍內使用,增強代碼的安全性和可維護性。

三、委托與事件的關系

事件是委托的一種特殊用法,用于實現發布者/訂閱者模式,實現對象之間的松耦合通信。委托是一種通用的類型,用于引用方法并執行它們,而事件是委托的一種實現,允許對象訂閱和響應特定情況的通知,從而促進模塊化和可維護的代碼設計。通過事件,對象可以在不直接依賴于其他對象的情況下,將重要信息傳遞給感興趣的觀察者。
下面將用一個案例來理解委托和事件
為了更好地理解委托和事件,我們可以以一個簡單的溫度監測系統為例。假設有一個溫度監測器對象,當溫度發生變化時,它可以通知其他對象執行相應的操作。
using System;
// 定義一個委托,用于處理溫度變化事件
delegate void TemperatureChangeHandler(double temperature);
// 溫度監控類
class TemperatureMonitor
{
    // 定義事件,將委托作為事件處理程序
    public event TemperatureChangeHandler TemperatureChanged;
    private double currentTemperature; // 當前溫度
    // 屬性,獲取和設置當前溫度,當溫度發生變化時觸發事件
    public double CurrentTemperature
    {
        get { return currentTemperature; }
        set
        {
            if (value != currentTemperature)
            {
                currentTemperature = value;
                OnTemperatureChanged(value); // 溫度變化時調用事件
            }
        }
    }
    // 觸發溫度變化事件的方法
    protected virtual void OnTemperatureChanged(double temperature)
    {
        TemperatureChanged?.Invoke(temperature); // 調用事件處理程序
    }
}
class Program
{
    static void Main(string[] args)
    {
        TemperatureMonitor monitor = new TemperatureMonitor();
        // 訂閱溫度變化事件,將方法 OnTemperatureChanged 作為事件處理程序
        monitor.TemperatureChanged += OnTemperatureChanged;
        // 改變當前溫度,觸發事件
        monitor.CurrentTemperature = 25.5;
        Console.ReadKey();
    }
    // 溫度變化事件處理程序
    static void OnTemperatureChanged(double temperature)
    {
        Console.WriteLine($"溫度變化 {temperature}°C");
    }
}
//案例參考:C#委托事件-張子陽

效果如下:

以上代碼示例使用了委托和事件,實現了觀察者模式。觀察者模式是一種行為設計模式,它定義了對象之間的一對多依賴關系,使得當一個對象的狀態發生變化時,所有依賴于它的對象都會得到通知并自動更新。在這個示例中,TemperatureMonitor 類充當了被觀察者(發布者),Program 類中的 OnTemperatureChanged 方法充當觀察者(訂閱者)

結語

委托和事件是C#中的重要概念,在C#中無論是實現回調機制、處理異步操作,還是實現事件驅動的架構,委托和事件都是不可缺的,每個.NET開發者都應該深入了解和熟練掌握。本文只列出了部分基礎知識點,更多知識點大家可以到官網查詢。
希望本文對你有所收獲,對于C#委托和事件的知識點,你還知道哪些?歡迎留言討論或者吐槽本文。
參考:
1、chatgpt 
2、微軟官方文檔 :
委托:learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/
事件:learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/


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