最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 中的委托與事件實(shí)現(xiàn)靈活的回調(diào)機(jī)制(應(yīng)用場景分析)

 更新時(shí)間:2024年12月24日 14:14:30   作者:Envy???  
委托提供了一種類型安全的方式將方法作為參數(shù)傳遞,而事件則允許對(duì)象通知其他對(duì)象發(fā)生了某些事情,這篇文章主要介紹了C# 中的委托與事件實(shí)現(xiàn)靈活的回調(diào)機(jī)制,需要的朋友可以參考下

C#中的委托(Delegate)和事件(Event)。委托和事件是C#中非常重要的特性,它們?cè)试S你實(shí)現(xiàn)回調(diào)機(jī)制和發(fā)布-訂閱模式,從而提高代碼的靈活性和解耦程度。通過使用委托和事件,你可以編寫更加模塊化和可擴(kuò)展的應(yīng)用程序。以下是一篇關(guān)于C#中委托和事件的文章。

引言

委托(Delegate)和事件(Event)是C#中非常重要的特性,它們?cè)试S你實(shí)現(xiàn)回調(diào)機(jī)制和發(fā)布-訂閱模式,從而提高代碼的靈活性和解耦程度。通過使用委托和事件,你可以編寫更加模塊化和可擴(kuò)展的應(yīng)用程序。本文將詳細(xì)介紹C#中的委托和事件,包括其基本概念、使用方法和應(yīng)用場景。

委托的基本概念

什么是委托?

委托是一種類型安全的函數(shù)指針,它允許你將方法作為參數(shù)傳遞給其他方法。委托定義了一個(gè)方法簽名,任何符合該簽名的方法都可以被委托實(shí)例引用。

定義委托

可以通過 delegate 關(guān)鍵字來定義委托類型。

public delegate void NotifyHandler(string message);

使用委托

定義了委托后,可以在類中聲明委托類型的字段或?qū)傩裕⒃谛枰獣r(shí)調(diào)用委托。

public class Notifier
{
    public event NotifyHandler OnNotify;
    public void TriggerNotification(string message)
    {
        OnNotify?.Invoke(message); // 調(diào)用所有訂閱者
    }
}
public class Subscriber
{
    public Subscriber(Notifier notifier)
    {
        notifier.OnNotify += HandleNotification;
    }
    private void HandleNotification(string message)
    {
        Console.WriteLine($"Received notification: {message}");
    }
}
// 使用委托
var notifier = new Notifier();
var subscriber = new Subscriber(notifier);
notifier.TriggerNotification("Hello, World!");

內(nèi)置委托類型

C# 提供了一些內(nèi)置的委托類型,如 ActionFunc,它們簡化了常見的委托定義。

Action 委托

Action 是一個(gè)沒有返回值的委托,可以接受多個(gè)輸入?yún)?shù)。

Action<string> printAction = Console.WriteLine;
printAction("Hello, World!");

Func 委托

Func 是一個(gè)有返回值的委托,可以接受多個(gè)輸入?yún)?shù)。

Func<int, int, int> addFunc = (a, b) => a + b;
Console.WriteLine(addFunc(3, 5)); // 輸出: 8

事件的基本概念

什么是事件?

事件是一種特殊的委托,它允許對(duì)象通知其他對(duì)象發(fā)生了某些事情。事件通常用于實(shí)現(xiàn)發(fā)布-訂閱模式,使得代碼更加解耦和模塊化。

定義事件

事件基于委托類型定義,通常使用 event 關(guān)鍵字來聲明。

public class Publisher
{
    public event EventHandler<EventArgs> SomethingHappened;
    protected virtual void OnSomethingHappened()
    {
        SomethingHappened?.Invoke(this, EventArgs.Empty);
    }
    public void DoSomething()
    {
        // 模擬發(fā)生某件事情
        OnSomethingHappened();
    }
}
public class Subscriber
{
    public Subscriber(Publisher publisher)
    {
        publisher.SomethingHappened += Publisher_SomethingHappened;
    }
    private void Publisher_SomethingHappened(object sender, EventArgs e)
    {
        Console.WriteLine("Something happened!");
    }
}
// 使用事件
var publisher = new Publisher();
var subscriber = new Subscriber(publisher);
publisher.DoSomething(); // 觸發(fā)事件

自定義事件參數(shù)

為了傳遞更多信息,可以創(chuàng)建自定義的事件參數(shù)類,繼承自 EventArgs

public class CustomEventArgs : EventArgs
{
    public string Message { get; set; }
}
public class Publisher
{
    public event EventHandler<CustomEventArgs> SomethingHappened;
    protected virtual void OnSomethingHappened(CustomEventArgs e)
    {
        SomethingHappened?.Invoke(this, e);
    }
    public void DoSomething(string message)
    {
        OnSomethingHappened(new CustomEventArgs { Message = message });
    }
}
public class Subscriber
{
    public Subscriber(Publisher publisher)
    {
        publisher.SomethingHappened += Publisher_SomethingHappened;
    }
    private void Publisher_SomethingHappened(object sender, CustomEventArgs e)
    {
        Console.WriteLine($"Publisher says: {e.Message}");
    }
}
// 使用自定義事件參數(shù)
var publisher = new Publisher();
var subscriber = new Subscriber(publisher);
publisher.DoSomething("Hello, World!"); // 觸發(fā)事件并傳遞信息

應(yīng)用場景

用戶界面交互

事件廣泛應(yīng)用于用戶界面組件之間通信,例如按鈕點(diǎn)擊、文本框輸入等。

button.Click += (sender, e) => MessageBox.Show("Button clicked!");

數(shù)據(jù)綁定

事件可用于數(shù)據(jù)綁定,當(dāng)數(shù)據(jù)源發(fā)生變化時(shí)觸發(fā)更新。

dataSource.PropertyChanged += (sender, e) => UpdateUI();

日志記錄

事件可以用來實(shí)現(xiàn)日志記錄功能,當(dāng)某個(gè)操作完成時(shí)記錄相關(guān)信息。

logger.Logged += (sender, e) => WriteLogToFile(e.Message);

結(jié)論

通過使用委托和事件,可以實(shí)現(xiàn)靈活的回調(diào)機(jī)制和發(fā)布-訂閱模式,從而提高代碼的靈活性和解耦程度。委托提供了一種類型安全的方式將方法作為參數(shù)傳遞,而事件則允許對(duì)象通知其他對(duì)象發(fā)生了某些事情。希望本文能夠幫助你更好地理解和應(yīng)用C#中的委托和事件技術(shù)。如果你有任何疑問或需要進(jìn)一步的信息,請(qǐng)隨時(shí)留言討論!

希望這篇關(guān)于C#中委托和事件的文章對(duì)你有所幫助。如果有任何問題或需要進(jìn)一步的信息,請(qǐng)隨時(shí)告訴我!

到此這篇關(guān)于C# 中的委托與事件:實(shí)現(xiàn)靈活的回調(diào)機(jī)制的文章就介紹到這了,更多相關(guān)C# 委托與事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#如何取硬件標(biāo)志

    C#如何取硬件標(biāo)志

    C#如何取硬件標(biāo)志...
    2007-03-03
  • c#結(jié)構(gòu)和類的相關(guān)介紹

    c#結(jié)構(gòu)和類的相關(guān)介紹

    結(jié)構(gòu)和類的共同點(diǎn)都是屬于抽象數(shù)據(jù)類型,包含數(shù)據(jù)和數(shù)據(jù)的操作。不同點(diǎn)在于結(jié)構(gòu)偏重于數(shù)據(jù)語意,而類偏重於行為語意。
    2012-12-12
  • C#代碼實(shí)現(xiàn)將PDF轉(zhuǎn)換為PDF線性化格式

    C#代碼實(shí)現(xiàn)將PDF轉(zhuǎn)換為PDF線性化格式

    PDF 線性化是一種對(duì) PDF 文件進(jìn)行優(yōu)化的方式,本文將為大家詳細(xì)介紹如何使用C#代碼將普通 PDF 轉(zhuǎn)換為線性化 PDF,感興趣的小伙伴可以參考一下
    2026-04-04
  • C# pictureBox用法案例詳解

    C# pictureBox用法案例詳解

    這篇文章主要介紹了C# pictureBox用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Unity實(shí)現(xiàn)首字母檢索器

    Unity實(shí)現(xiàn)首字母檢索器

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)首字母檢索器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • ASP.NET C#中Application的用法教程

    ASP.NET C#中Application的用法教程

    這篇文章主要給大家介紹了關(guān)于ASP.NET C#中Application的用法,在介紹Application的用法之前,先給大家介紹了Session的用法供大家參考學(xué)習(xí),文中介紹的非常詳細(xì),需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-05-05
  • C#.NET 圖片水印添加代碼

    C#.NET 圖片水印添加代碼

    這篇文章主要為大家詳細(xì)介紹了C#.NET 圖片水印添加代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • C#實(shí)現(xiàn)圖片輪播功能的示例代碼

    C#實(shí)現(xiàn)圖片輪播功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)圖片輪播功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#數(shù)組越界異常IndexOutOfRangeException的原因及解決方案

    C#數(shù)組越界異常IndexOutOfRangeException的原因及解決方案

    在C#開發(fā)中,數(shù)組越界異常(IndexOutOfRangeException)是一種常見且容易忽視的運(yùn)行時(shí)錯(cuò)誤,它通常發(fā)生在嘗試訪問數(shù)組中不存在的索引位置時(shí),導(dǎo)致程序崩潰或行為異常,本文將深入探討數(shù)組越界異常的原因,并提供全網(wǎng)最有效、最簡單的解決方案,需要的朋友可以參考下
    2025-07-07
  • unity android設(shè)備上查看log輸出方式

    unity android設(shè)備上查看log輸出方式

    這篇文章主要介紹了unity android設(shè)備上查看log輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評(píng)論

海安县| 绿春县| 潢川县| 汨罗市| 焦作市| 阳江市| 双桥区| 贺兰县| 江北区| 禄丰县| 余姚市| 青海省| 明溪县| 酉阳| 九江市| 曲麻莱县| 普兰县| 绥德县| 高碑店市| 牙克石市| 桐乡市| 独山县| 固镇县| 淅川县| 云林县| 贵德县| 莲花县| 个旧市| 长泰县| 乌鲁木齐县| 保靖县| 格尔木市| 铜梁县| 江安县| 满洲里市| 花垣县| 铅山县| 于都县| 桓仁| 商城县| 赤峰市|