全面解析:C# 委托的實質(zhì)性應用與優(yōu)勢
共 12773字,需瀏覽 26分鐘
·
2024-06-20 17:01
前言
有人問C#的委托(Delegate)有什么實質(zhì)性用途?委托在C#其實是無處不在,那么它具體用在那里呢?。
本文將從委托(Delegate)定義和演變講起,讓大家一目了然。
C#的委托(Delegate)是強類型的函數(shù)指針,用于引用方法并允許將方法作為參數(shù)傳遞。隨著C#的演變,委托的功能和用途變得越來越強大和靈活。
本文將從C#委托的演變談起,詳細介紹其實質(zhì)性用途,并通過代碼實例加以證明。
委托的演變
C# 1.0: 基本委托
在C# 1.0中,引入了基本的委托概念,使得方法可以作為對象傳遞。這是實現(xiàn)事件和回調(diào)機制的基礎。
using System;
public delegate void Notify(); // 聲明委托
public class ProcessBusinessLogic
{
public event Notify ProcessCompleted; // 使用委托聲明事件
public void StartProcess()
{
Console.WriteLine("Process Started!");
// 模擬一些處理任務
System.Threading.Thread.Sleep(3000);
// 處理完成后觸發(fā)事件
OnProcessCompleted();
}
protected virtual void OnProcessCompleted()
{
ProcessCompleted?.Invoke();
}
}
class Program
{
static void Main(string[] args)
{
ProcessBusinessLogic bl = new ProcessBusinessLogic();
bl.ProcessCompleted += Bl_ProcessCompleted; // 訂閱事件
bl.StartProcess();
}
private static void Bl_ProcessCompleted()
{
Console.WriteLine("Process Completed!");
}
}
C# 2.0: 匿名方法
C# 2.0引入了匿名方法,使得委托的使用更加靈活,不需要單獨定義方法即可實現(xiàn)回調(diào)。
using System;
public delegate void Print(int value);
public class Program
{
public static void Main(string[] args)
{
Print print = delegate(int val) {
Console.WriteLine("Anonymous method: {0}", val);
};
print(100);
}
}
C# 3.0: Lambda表達式
C# 3.0進一步引入了Lambda表達式,簡化了委托的語法,使得代碼更加簡潔和易讀。
using System;
public delegate void Print(int value);
public class Program
{
public static void Main(string[] args)
{
Print print = (val) => Console.WriteLine("Lambda expression: {0}", val);
print(200);
}
}
C# 4.0及以后: 泛型委托和內(nèi)置委托類型
隨著C#的不斷發(fā)展,泛型委托和內(nèi)置委托類型(如Action、Func和Predicate)被引入,進一步增強了委托的功能和靈活性。
using System;
public class Program
{
public static void Main(string[] args)
{
Action<int> print = val => Console.WriteLine("Action delegate: {0}", val);
print(300);
Func<int, int> square = x => x * x;
Console.WriteLine("Func delegate: {0}", square(5));
Predicate<int> isPositive = x => x > 0;
Console.WriteLine("Predicate delegate: {0}", isPositive(10));
}
}
委托的實質(zhì)性用途
1、簡單回調(diào)機制
在編寫需要回調(diào)功能的代碼時,委托可以扮演重要角色。例如,當一個方法完成某項任務時,可以通過回調(diào)通知調(diào)用者。
using System;
public delegate void Notify(); // 聲明委托
public class ProcessBusinessLogic
{
public event Notify ProcessCompleted; // 使用委托聲明事件
public void StartProcess()
{
Console.WriteLine("Process Started!");
// 模擬一些處理任務
System.Threading.Thread.Sleep(3000);
// 處理完成后觸發(fā)事件
OnProcessCompleted();
}
protected virtual void OnProcessCompleted()
{
ProcessCompleted?.Invoke();
}
}
class Program
{
static void Main(string[] args)
{
ProcessBusinessLogic bl = new ProcessBusinessLogic();
bl.ProcessCompleted += Bl_ProcessCompleted; // 訂閱事件
bl.StartProcess();
}
private static void Bl_ProcessCompleted()
{
Console.WriteLine("Process Completed!");
}
}
在這個例子中,當StartProcess方法執(zhí)行完畢時,會通過委托Notify通知訂閱者。
2、多播委托
多播委托可以引用多個方法,并且在調(diào)用時按順序調(diào)用這些方法。這對于需要依次執(zhí)行多個處理的場景非常有用。
using System;
public delegate void Notify(); // 聲明委托
public class Program
{
public static void Main(string[] args)
{
Notify notify = Method1;
notify += Method2; // 訂閱多個方法
notify();
}
public static void Method1()
{
Console.WriteLine("Method1 invoked.");
}
public static void Method2()
{
Console.WriteLine("Method2 invoked.");
}
}
在這個例子中,notify委托依次調(diào)用Method1和Method2。
3、匿名方法和Lambda表達式
委托可以結(jié)合匿名方法和Lambda表達式使用,使代碼更加簡潔和靈活。
using System;
public delegate void Print(int value);
public class Program
{
public static void Main(string[] args)
{
Print print = delegate(int val) {
Console.WriteLine("Anonymous method: {0}", val);
};
print(100);
print = (val) => Console.WriteLine("Lambda expression: {0}", val);
print(200);
}
}
在這個例子中,使用匿名方法和Lambda表達式定義委托的實現(xiàn)方式,使代碼更加簡潔。
4、事件處理
委托是事件處理的基礎,通過委托可以實現(xiàn)事件的定義和處理。例如,在用戶界面編程中,按鈕的點擊事件處理。
using System;
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處理點擊事件。
5、函數(shù)式編程
委托允許將函數(shù)作為對象處理,使得C#能夠支持一定程度的函數(shù)式編程。例如,LINQ(Language Integrated Query)大量使用了委托和Lambda表達式。
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
List<int> evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
evenNumbers.ForEach(n => Console.WriteLine(n));
}
}
在這個例子中,Where方法接受一個委托Func<int, bool>來篩選列表中的偶數(shù)。
總結(jié)
C#的委托從基本概念到匿名方法,再到Lambda表達式和泛型委托,其演變展示了語言的強大和靈活。
委托在回調(diào)、多播、事件處理以及函數(shù)式編程中的廣泛應用,極大地增強了C#的功能和代碼可維護性。
通過本文的示例,可以清晰地看到委托的實質(zhì)性用途和在現(xiàn)代編程中的重要地位。
希望本文對大家有所收獲,大家對委托有什么看法,歡迎留言討論。
轉(zhuǎn)自:莫小星
鏈接:mp.weixin.qq.com/s/93d5QW4LsC20G0v1re9bEw
