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 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#委托和事件之间的区别如下:

  1. 委托是一个包含一个或多个方法引用的对象,它可以在程序中传递和调用方法。而事件是一个特殊类型的委托,它只能在定义它的类中触发,并且它通常用于实现观察者模式。

  2. 委托可以在程序中的任何地方调用,而事件只能在定义事件的类中触发。

  3. 委托可以被任何方法调用,而事件只能由一个或多个特定的方法注册和调用。

  4. 委托可以使用“+”和“-”运算符来添加和移除方法,而事件只能使用“+=”和“-=”运算符来添加和移除事件处理程序。

  5. 委托可以直接调用方法,而事件必须在事件处理程序中被触发。