骨头豆腐饭 发表于 2023-8-1 19:14:13

C#委托和事件简单复习

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 或 Func int 就是方法的返回值
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#委托和事件之间的区别如下:

[*]委托是一个包含一个或多个方法引用的对象,它可以在程序中传递和调用方法。而事件是一个特殊类型的委托,它只能在定义它的类中触发,并且它通常用于实现观察者模式。
[*]委托可以在程序中的任何地方调用,而事件只能在定义事件的类中触发。
[*]委托可以被任何方法调用,而事件只能由一个或多个特定的方法注册和调用。
[*]委托可以使用“+”和“-”运算符来添加和移除方法,而事件只能使用“+=”和“-=”运算符来添加和移除事件处理程序。
[*]委托可以直接调用方法,而事件必须在事件处理程序中被触发。

来源:https://www.cnblogs.com/ChuanC/archive/2023/08/01/17598850.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: C#委托和事件简单复习