C#委托
太久没用了,简单的复习一下
快速过一遍语法使用
使用委托的步骤
1.定义一个委托类型
只需要在声明的前面加上delegate关键字,其他的就跟声明一个方法(函数)类似
public delegate void SayHello(string name);
2.使用刚刚声明的委托
需要定义一个返回值跟参数与我们刚刚定义的委托一致
public static void MyFunc(string name)
{
Console.WriteLine($"Hello {name}");
}
3.然后声明一个SayHello类型(委托)的变量
把前面定义的方法赋值给变量
然后就可以使用委托像正常调用MyFunc一样使用该方法
SayHello say = MyFunc;
//调用委托
say("Tom");
//进入MyFunc输出 "Hello Tom"
也可以使用Lambda表达式给委托赋值
SayHello say = (string name)=> {
Console.WriteLine($"Hello {name}");
};
SayHello say = name=> {
Console.WriteLine($"Hello {name}");
};
效果都是一样的
委托也可以定义为泛型,除了delegate其他都与声明方法(函数)无异
public delegate bool Compare<T1,T2>(T1 t1,T2 t2);
二
对委托最常使用的方法是 Invoke() 和 BeginInvoke() / EndInvoke()
Invoke() 会调用赋值给委托的所有方法
直接调用也是全部方法都调用say()
要注意的是除了第一次赋值其他都要用+=的方式赋值,否则后面的会覆盖掉前面的
最终结果输出 "不想打招呼"
//第一次赋值
SayHello say = name => {
Console.WriteLine($"你好 {name}");
};
//还是用 = 号赋值
say = MyFunc;
say = _ => {
Console.WriteLine("不想打招呼");
};
say("Tom");
//say.Invoke("Tom");
最终输出 :
{
你好 Tom
Hello Tom
不想打招
}
//第一次赋值
SayHello say = name => {
Console.WriteLine($"你好 {name}");
};
say += MyFunc;
say += _ => {
Console.WriteLine("不想打招呼");
};
say("Tom");
//say.Invoke("Tom");
还有就是可以使用 -= 移除方法
SayHello say = name => {
Console.WriteLine($"你好 {name}");
};
say += MyFunc;
say += _ => {
Console.WriteLine("不想打招呼");
};
//移除MyFunc,这样最后就不会输出 Hello Tom 了
say-=MyFunc;
say("Tom");
官方提供的定义好的委托
1.Action:没有返回值,返回值为void
2.Func:有返回值,泛型的最后一个参数为返回值类型,
比如:Func<string,int> 或 Func
3.Predicate 返回值为 bool
事件 Event
事件是跟委托结合使用的,事件基于委托,而且是多播委托
定义一个事件的语法就是 event +委托(定义好的委托)+变量名(随便取,不过最好规范点)
public event SayHello OnSayHello;
和委托不一样事件只能通过+= 和 -= 添加和移除方法
所有添加(订阅了OnSayHello)的方法在事件调用(触发)的时候都会收到通知,
也就是被调用
OnSayHello += Program_OnSayHello;
OnSayHello += s => {
Console.WriteLine($"张三听到有人在叫{s}");
};
OnSayHello += _ => { Console.WriteLine("有人在招呼?"); };
//OnSayHello("Tom");
OnSayHello.Invoke("Tom");
private static void Program_OnSayHello(string name)
{
Console.WriteLine($"有人在跟{name}招呼");
}
//最终输出
有人在跟Tom招呼
张三听到有人在叫Tom
有人在招呼?
区别委托和事件
我们发现委托跟事件 好像很像,但还是要根据不同的情况选择。
更多
C#委托和事件之间的区别如下:
-
委托是一个包含一个或多个方法引用的对象,它可以在程序中传递和调用方法。而事件是一个特殊类型的委托,它只能在定义它的类中触发,并且它通常用于实现观察者模式。
-
委托可以在程序中的任何地方调用,而事件只能在定义事件的类中触发。
-
委托可以被任何方法调用,而事件只能由一个或多个特定的方法注册和调用。
-
委托可以使用“+”和“-”运算符来添加和移除方法,而事件只能使用“+=”和“-=”运算符来添加和移除事件处理程序。
-
委托可以直接调用方法,而事件必须在事件处理程序中被触发。