1.委托
我给委托总结了两点,大家可以看看(仅供参考)
- 委托就是存放方法的数组
- 委托就是一个方法的类型
下面,我们通过一个很简单的代码片段来认识一下
using System;
namespace MyDelegate
{
delegate void Say(string name);
class Program
{
public static event Say SayHelloEvent;
static void Main(string[] args)
{
//委托实例名=要传入的方法
//此时是方法的引用,所以不带(),带()的话是该方法的调用。区分引用和调用
Say say = SayHello;
say += SayGoodBye;
say.Invoke("老王");
//匿名函数
Say say1 = delegate (string name)
{
Console.WriteLine($"{name},我是匿名函数");
};
say1("匿名函数说到:");
//lamda表达式
Say say2 = (name) =>
{
Console.WriteLine($"{name},我是lamda语句");
};
say2("lamda说到:");
//事件
SayHelloEvent += Programe_SayHelloEvent;//注册事件
if (SayHelloEvent != null)
{
SayHelloEvent("事件说到:");//调用事件
}
}
public static void Programe_SayHelloEvent(string name)
{
Console.WriteLine($"{name},我是事件");
}
public static void SayHello(string name)
{
Console.WriteLine($"你好:{name}");
}
public static void SayGoodBye(string name)
{
Console.WriteLine($"再见:{name}");
}
}
}
不难看出,我们先声明了一个委托,将其实例化,随后再进行调用。我们在调用的时候,需要注意:用委托类型直接加参数是Invoke(参数)的一个捷径。实等价调用 Invoke()。
say("老王");
say.Invoke("老王");
注意:实例化一个委托对象需要用一个方法来实例化,这个方法的返回值类型和参数列表需要和委托保持一致。
2.泛型委托
NET 框架为我们封装了三个泛型委托类,因此大部分情况下我们不必再声明委托,可以拿来直接实例化使用,
这三种泛型委托包括:Func委托、Action委托和Predicate委托。
其中也很好记:
1. Action无返回值的委托
2. Func<>有返回值的委托 注意:该泛型委托最多可以传递16个参数 最后一个是返回值类型
补充:委托链/多播委托
利用 +=运算符 将一组方法放入到一个委托中,当委托运行时,依次的运行其中的方法。但是只能得到最后一个返回值。
3.事件
声明事件之前必须声明该事件的委托类型,声明事件本身
时需要加上关键字event
delegate void Say(string name);
public static event Say SayHelloEvent;
上面的代码定义了一个名为 Say的委托和一个名为 SayHelloEvent的事件,该事件在生成的时候会调用委托。
上面代码最后的输出结果是:
代码很简单,就是为了方便大家理解一下思维,欢迎大家随时指正。
总结:
- 委托是类型,事件是对象。 事件的内部是用委托实现的
- 事件内部就是一个private的委托和add、remove两个方法