精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 委托的前世今生

admin
2024年12月23日 20:0 本文熱度 322

一、引言

在 C# 編程語言的發(fā)展歷程中,委托(Delegate)一直扮演著至關重要的角色。它是一種特殊的類型,允許將方法作為參數(shù)傳遞,從而實現(xiàn)回調(diào)機制、事件處理等功能。本文將從委托的起源講起,逐步剖析其在不同版本 C# 中的演變過程,以及在現(xiàn)代 C# 編程中的應用與優(yōu)勢。

二、委托的起源與基本概念

1. 起源

委托的概念最早可以追溯到 C# 1.0 版本。在那個時期,C# 作為一種新興的面向?qū)ο缶幊陶Z言,借鑒了許多其他語言的優(yōu)秀特性。委托的引入,受到了 C/C++ 中函數(shù)指針的啟發(fā)。在 C/C++ 中,函數(shù)指針可以指向一個函數(shù),并在程序運行時動態(tài)調(diào)用該函數(shù)。C# 設計者希望在 C# 中也能實現(xiàn)類似的功能,于是創(chuàng)造了委托這一概念。

2. 基本概念

委托是一種引用類型,它定義了一個方法簽名,可以用于存儲指向該簽名的方法。通過委托,你可以調(diào)用其他類中的方法。委托聲明決定了可由該委托引用的方法。例如,以下代碼定義了一個接受兩個整數(shù)并返回一個整數(shù)的委托:

public delegate int MyDelegate(int a, int b);

這個委托可以被用于引用任何一個帶有一個單一的 string 參數(shù)的方法,并返回一個 int 類型變量。

三、委托的演變過程

1. C# 1.0:基本委托

在 C# 1.0 中,委托的使用相對簡單,主要通過顯式定義委托類型,并使用已命名的方法來初始化委托實例。例如:

public delegate void Notify();
public class ProcessBusinessLogic
{
    public event Notify ProcessCompleted;
    public void StartProcess()
    {
        Console.WriteLine("Process Started!");
        System.Threading.Thread.Sleep(3000);
        OnProcessCompleted();
    }
    protected virtual void OnProcessCompleted()
    {
        ProcessCompleted?.Invoke();
    }
}

在這個例子中,Notify 委托用于定義一個無參無返回值的方法簽名,ProcessCompleted 事件使用該委托來通知調(diào)用者任務完成。

2. C# 2.0:匿名方法

C# 2.0 引入了匿名方法的概念,使得委托的使用更加靈活。匿名方法允許在委托調(diào)用中直接編寫未命名的內(nèi)聯(lián)語句塊,而不需要單獨定義方法。例如:

Print print = delegate(int val) {
    Console.WriteLine("Anonymous method: {0}", val);
};
print(100);

在這個例子中,使用匿名方法定義了一個Print 委托的實現(xiàn),直接在委托賦值時編寫了內(nèi)聯(lián)代碼。

3. C# 3.0:Lambda 表達式

C# 3.0 進一步引入了 Lambda 表達式,簡化了委托的語法。Lambda 表達式是一種更為簡潔和易讀的方式來定義匿名方法。例如:

Print print = (val) => Console.WriteLine("Lambda expression: {0}", val);
print(200);

在這個例子中,使用 Lambda 表達式定義了Print 委托的實現(xiàn),代碼更加簡潔。

4. C# 4.0 及以后:泛型委托和內(nèi)置委托類型

隨著 C# 的不斷發(fā)展,泛型委托和內(nèi)置委托類型(如ActionFunc 和Predicate)被引入,進一步增強了委托的功能和靈活性。例如:

Action<int> print = val => Console.WriteLine("Action delegate: {0}", val);
print(300);
Func<intint> square = x => x * x;
Console.WriteLine("Func delegate: {0}", square(5));
Predicate<int> isPositive = x => x > 0;
Console.WriteLine("Predicate delegate: {0}", isPositive(10));

在這個例子中,使用內(nèi)置的ActionFunc 和Predicate 委托類型來定義不同的委托。

四、委托的現(xiàn)代應用與優(yōu)勢

1. 事件處理

委托是事件處理的基礎。通過委托,可以實現(xiàn)事件的定義和處理。例如,在用戶界面編程中,按鈕的點擊事件處理:

public class Button
{
    public delegate void ClickHandler(object sender, EventArgs e);
    public event ClickHandler Click;
    public void OnClick(EventArgs e)
    {
        Click?.Invoke(this, e);
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        Button button = new Button();
        button.Click += Button_Click;
        button.OnClick(EventArgs.Empty);
    }
    private static void Button_Click(object sender, EventArgs e)
    {
        Console.WriteLine("Button clicked!");
    }
}

在這個例子中,Button 類定義了Click 事件,通過委托ClickHandler 處理點擊事件。

2. 回調(diào)機制

在編寫需要回調(diào)功能的代碼時,委托可以扮演重要角色。例如,當一個方法完成某項任務時,可以通過回調(diào)通知調(diào)用者。

3. 函數(shù)式編程

委托允許將函數(shù)作為對象處理,使得 C# 能夠支持一定程度的函數(shù)式編程。例如,LINQ(Language Integrated Query)大量使用了委托和 Lambda 表達式:

List<int> numbers = new List<int> { 12345 };
List<int> evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
evenNumbers.ForEach(n => Console.WriteLine(n));

在這個例子中,Where 方法接受一個委托Func<int, bool> 來篩選列表中的偶數(shù)。

4. 多播委托

多播委托允許將多個相同類型的委托方法組合在一起,執(zhí)行時會按照順序調(diào)用所有的委托方法。這在需要執(zhí)行多個回調(diào)或事件處理時非常有用。

五、總結

C# 的委托從基本概念到匿名方法,再到 Lambda 表達式和泛型委托,其演變展示了語言的強大和靈活。委托在回調(diào)、多播、事件處理以及函數(shù)式編程中的廣泛應用,極大地增強了 C# 的功能和代碼可維護性。掌握委托的使用,對于深入理解 C# 編程語言和 .NET 框架具有重要意義。


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

主站蜘蛛池模板: 亚洲精品久久无码一区二区大长腿 | 性色av不卡一区二区 | 欧洲无码一区二区三区在线观看 | 无人区一码二码三码四码区 | 人妻少妇-嫩草影院 | 精品日韩国产欧美在线观看 | 10000部18以下禁拍拍视频 | 日韩精品一区二区三区在线观 | 无码国产精品一区二区免费式芒果小说最新传媒中文字幕 | 亚洲熟妇无码AV不卡在线播放 | 欧美日韩国产泰国一区 | 免费无码又爽又刺激毛片 | 人妻av中文字幕久久 | 亚洲九九精品一区二区三区 | 韩国青草视频19禁福利 | 国产免费无码又爽又刺激A片动漫 | 国产亚洲精品久久一区二区三区 | 少妇特黄A片一区二区三区免费看 | 久久精品人妻无码一区二区三区 | 51影院新地址永久入口 | 日韩综合aⅴ视频 | 久久综合一区二区不卡 | 久久久久国产成人精品亚洲午夜 | 中文字幕av无码一区二区三区电影 | 午夜片神马影院福利 | 人妻少妇中文字幕久久18 | 99无码熟妇丰满人妻啪啪 | 国产成人无码久久久久毛片 | 日韩一区二区在线观看视频 | 国产一区二区三区在线 | 亚洲精品无码日韩国产不卡v | 无码不卡v东京热毛片 | 久久精品无码人妻无码AV蜜臀 | 免费的成人性视频网站 | 无套内谢少妇毛片免费看看 | 国产精品一区高清在线观看 | 人妻在线无码一区二区三区 | 国产精品久久久久久久免费A片 | 国产裸体歌舞一区二区 | 亚洲欧美日韩视频高清专区 | 娇妻在客厅被朋友玩得呻吟漫画 |