1.委托基础语句
定义一个委托类型,再实例化该委托类型,向这个委托实例赋值一个函数,再调用这个委托实例即可实现委托。
namespace Vision
{
delegate void dHelp();//定义委托
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
dHelp h;//委托实例
h = SaySometing;//实例赋值
h();//委托调用
void SaySometing()
{
MessageBox.Show("Hello");
}
}
}
}
2.委托的作用
委托用于存放行为(即方法),行为由调用者决定。
namespace QLVision
{
delegate void dHelp();//定义委托
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
void Talk(dHelp help)//传参为委托
{
help();//方法内执行委托方法
}
void SayHello()
{
MessageBox.Show("Hello");
}
void SayBye()
{
MessageBox.Show("Bye");
}
Talk(SayHello);//方法调用
Talk(SayBye);//方法调用
}
}
}
3.委托的分类
与方法名和方法体无关,只按返回类型,参数类型,参数个数分类。
4.委托的简化
.NET提供了泛型委托,减少了创建委托的代码
Action :无返回值;链接:Action 委托 (System) | Microsoft Docs
Func :有返回值;链接:Func<TResult> 委托 (System) | Microsoft Docs
namespace QLVision
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
void Talk(Action help)//传参为委托
{
help();//执行委托方法
}
Talk(SayHello);//调用方法
void SayHello()
{
MessageBox.Show("Hello");
}
}
}
}
使用Lambda表达式:
namespace QLVision
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
void Talk(Action help)//传参为委托
{
help();//执行委托方法
}
Talk(() => MessageBox.Show("Hello"));//Lamda表达式
}
}
}
5.多播委托
一个委托实例可以使用 += 运算符合并多个相同类型的委托,称为委托的多播。当然,也可以使用 -= 运算符移除委托。
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// 创建委托实例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
// 调用多播
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
运行结果:
Value of Num: 75
参考链接: