目录
1,什么是委托?
委托是一种持有一个或多个方法的类,也是一种引用类型,它表示对具有特定参数列表和返回类型的方法的引用
委托的实例实际上是调用者的代表,调用者先调用委托,委托再调用方法。这种间接的方式可以将调用这和委托分开。
如果学过C++,理解委托最快的方法就是把它看成一个加强版、更安全的函数指针
2,怎样使用委托?
下面是一个简单例子:
delegate void MyDel(int value); //声明委托类型,该委托带一个int类型参数
class Program
{
public void PrintLow(int value)
{
Console.WriteLine($"{ value}-Low value");
}
public void PrintHigh(int value)
{
Console.WriteLine($"{ value}-High value");
}
}
static void Main()
{
Program program = new Program();
MyDel del; //声名委托变量
//创建随机整数生成器对象,并得到一个随机数
Random rand = new Random();
int randomCount = rand.Next(99);
//创建一个包含PrintLow或PrintHigh的委托对象,并将其赋值给del变量
if (randomCount < 20)
{
del = new MyDel(program.PrintLow);
}
else
{
del = new MyDel(program.PrintHigh);
}
del(randomCount); //执行委托,等同于del.Invoke(randomCount);
}
注意:1,虽然委托类型声明看上去和方法声明一样,但它不需要在类内部声明
2,委托所包含的方法,返回值类型和参数列表必须保持一致
3,为委托添加/减少方法
下面是栗子:
MyDel del= Program.PrintLow; //这里省略了new操作,是创建委托的快捷语法,这里创建并初始化了一个委托
del += Program.PrintHigh; //使用 += 运算符为委托增加方法
del -= Program.PrintLow; //使用 -= 运算符从委托移除方法
4,使用匿名方法实例化委托
栗子如下:
class Program
{
delegate int Mydel(int value);
static void Main()
{
//注意,这里return语句很好的保持了和委托返回值类型int一致,
两者也必须保持一致
Mydel del = delegate(int x)
{
return x+10;
};
Console.WriteLine("0",del(6));
}
}
注意:1,如果委托是void 返回值类型,匿名方法就不能返回值
5,使用Lambda表达式
引入Lambda表达式代替匿名方法实例化委托,只是为了简化语法
其经常的简化用法,栗子:
MyDel del = delegate (int x) { return x + 1; }; //匿名方法
MyDel del = (int x)=>{ return x + 1; }; //Lambda表达式,省略delegate
MyDel del = (x)=>{ return x + 1; }; //Lambda表达式,省略参数类型int
6,其他
注意:1,应当适当地使用接口取代对委托的使用,以降低这种方法级别的耦合
其他像多播委托、泛型委托、Func 和 Action 委托、委托VS接口 等相关知识可以参考下面大佬链接:
(73条消息) C#学习笔记(三)—–C#高级特性中的委托与事件(上)_w343516704的博客-CSDN博客
(73条消息) 【C# 7.0 in a Nutshell】第4章 C#的高级特性——委托_c# in a nutshell_今岁成蹊的博客-CSDN博客