欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#基礎(chǔ)之委托詳解(Delegate)

 更新時(shí)間:2025年03月28日 14:12:40   作者:學(xué)亮編程手記  
這篇文章主要介紹了C#基礎(chǔ)之委托(Delegate),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C#中的委托(Delegate)是一種類型安全的函數(shù)指針,用于封裝方法的引用。委托允許你將方法作為參數(shù)傳遞給其他方法,或者將方法存儲在變量中供后續(xù)調(diào)用。這種設(shè)計(jì)模式在事件處理、回調(diào)函數(shù)、異步編程等場景中尤為常用。

下面對C#委托進(jìn)行詳細(xì)解釋,并提供代碼示例。

1. 委托定義

在C#中,定義一個(gè)委托類型需要指定其參數(shù)類型和返回類型。

其語法形式如下:

public delegate 返回類型 委托名(參數(shù)類型 參數(shù)名[, ...]);

例如,定義一個(gè)接受兩個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)的委托:

public delegate int MathOperation(int num1, int num2);

2. 委托實(shí)例化

要使用委托,首先需要?jiǎng)?chuàng)建一個(gè)委托實(shí)例,并將一個(gè)具有匹配簽名的方法賦值給它。

方法可以是靜態(tài)的、實(shí)例的,甚至可以是匿名方法或lambda表達(dá)式。

public static int Add(int a, int b) => a + b;
public static int Subtract(int a, int b) => a - b;

MathOperation addDelegate = new MathOperation(Add);
MathOperation subtractDelegate = new MathOperation(Subtract);

或者使用C# 2.0引入的隱式類型化:

MathOperation addDelegate = Add;
MathOperation subtractDelegate = Subtract;

3. 多播委托(Multicast Delegates)

C#委托可以組合(+=)或分離(-=)其他委托實(shí)例,形成一個(gè)多播委托。

多播委托在調(diào)用時(shí)會(huì)依次執(zhí)行所有關(guān)聯(lián)方法。

這對于事件處理等場景特別有用,一個(gè)事件可以有多個(gè)訂閱者(處理器)。

MathOperation combinedDelegate = addDelegate + subtractDelegate;
int result = combinedDelegate.Invoke(10, 5); // 先調(diào)用Add,后調(diào)用Subtract

4. 委托的用途

事件處理

C#中的事件就是一種特殊的委托類型,用于實(shí)現(xiàn)發(fā)布-訂閱模式。

一個(gè)類可以發(fā)布事件,其他類可以訂閱這些事件并提供響應(yīng)方法。

當(dāng)事件觸發(fā)時(shí),所有訂閱者的方法會(huì)被依次調(diào)用。

public class Publisher
{
    public event EventHandler<MyEventArgs> CustomEvent;

    protected virtual void OnCustomEvent(MyEventArgs e)
    {
        CustomEvent?.Invoke(this, e);
    }

    public void TriggerEvent()
    {
        OnCustomEvent(new MyEventArgs("Event triggered"));
    }
}

public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.CustomEvent += OnCustomEvent;
    }

    private void OnCustomEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine($"Subscriber received event: {e.Message}");
    }
}

回調(diào)函數(shù)

委托可以用來封裝回調(diào)函數(shù),使得一個(gè)方法可以接受另一個(gè)方法作為參數(shù),待特定時(shí)機(jī)或條件滿足時(shí)調(diào)用。

public void PerformAsyncTask(Action<string> callback)
{
    Task.Run(() =>
    {
        // 模擬耗時(shí)操作
        Thread.Sleep(1000);

        // 完成任務(wù)后通過回調(diào)通知結(jié)果
        callback("Async task completed");
    });
}

// 使用回調(diào)
PerformAsyncTask(result =>
{
    Console.WriteLine($"Async task result: {result}");
});

LINQ查詢

在LINQ(Language Integrated Query)中,委托如Func<T, TResult>Action<T>被廣泛用于定義篩選、投影、聚合等操作。

var numbers = new[] { 1, 2, 3, 4, 5 };

// 使用Func<int, bool>作為謂詞篩選偶數(shù)
var evenNumbers = numbers.Where(n => n % 2 == 0);

// 使用Func<int, int, int>作為比較器排序
var sortedNumbers = numbers.OrderBy((a, b) => a.CompareTo(b));

5. 委托與Lambda表達(dá)式

C# 3.0引入了lambda表達(dá)式,極大地簡化了委托的使用。

Lambda表達(dá)式可以直接創(chuàng)建匿名方法,非常適合用于短小的委托定義。

MathOperation addLambda = (int a, int b) => a + b;

6. 委托與匿名方法

C# 2.0引入了匿名方法,可以在不創(chuàng)建單獨(dú)命名方法的情況下定義委托實(shí)例。

雖然lambda表達(dá)式現(xiàn)在更常用,但匿名方法在某些場景下仍有其價(jià)值。

MathOperation addAnonymous = delegate(int a, int b) { return a + b; };

總結(jié)

起來,C#委托是一種強(qiáng)大的語言特性,它使得方法可以作為參數(shù)傳遞,支持事件處理、回調(diào)、異步編程等多種編程模式。

通過與lambda表達(dá)式、匿名方法結(jié)合使用,可以更簡潔、靈活地編寫委托相關(guān)的代碼。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#串口接收程序的實(shí)現(xiàn)

    C#串口接收程序的實(shí)現(xiàn)

    本文主要介紹了C#串口接收程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C# WinForm調(diào)用Shell_NotifyIcon的示例代碼

    C# WinForm調(diào)用Shell_NotifyIcon的示例代碼

    這篇文章主要介紹了C# WinForm調(diào)用Shell_NotifyIcon的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • 詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息

    詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息

    這篇文章主要介紹了詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • c#下將.cs文件編譯成dll

    c#下將.cs文件編譯成dll

    c#下將.cs文件編譯成dll...
    2007-07-07
  • 深入理解C#之繼承

    深入理解C#之繼承

    這篇文章主要介紹了c# 繼承的相關(guān)資料,文中講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-07-07
  • C#實(shí)現(xiàn)異步編程的方法

    C#實(shí)現(xiàn)異步編程的方法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)異步編程的方法,什么是異步,如何實(shí)現(xiàn)異步編程,感興趣的小伙伴們可以參考一下
    2017-07-07
  • unity實(shí)現(xiàn)繪畫功能

    unity實(shí)現(xiàn)繪畫功能

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)繪畫功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C# BackgroundWorker使用教程

    C# BackgroundWorker使用教程

    這篇文章主要為大家詳細(xì)介紹了C# BackgroundWorker使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C#使用HttpClient進(jìn)行Post請求出現(xiàn)超時(shí)問題的解決及優(yōu)化

    C#使用HttpClient進(jìn)行Post請求出現(xiàn)超時(shí)問題的解決及優(yōu)化

    最近我的控制臺程序發(fā)現(xiàn)有時(shí)候總是出現(xiàn)請求超時(shí)等問題,通常好幾分鐘最多只有3-4個(gè)請求,在使用apipost發(fā)現(xiàn)并發(fā)10個(gè)5分鐘也沒有問題,那么問題就出在我的請求端了,所以本文給大家介紹了C# 使用HttpClient進(jìn)行Post請求總是出現(xiàn)超時(shí)問題的優(yōu)化,需要的朋友可以參考下
    2025-01-01
  • C#對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼的方法

    C#對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼的方法

    這篇文章主要介紹了C#對二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼的方法,涉及C#中Convert.ToBase64String用法技巧,需要的朋友可以參考下
    2015-04-04

最新評論