C# 中委托和事件的区别
对委托不了解的同学,可以看看这一篇文章 委托的介绍
- 事件是一个特殊的多播委托。
- 声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。
- 声明一个事件使用 event 关键字,而委托声明一个委托使用 delegate 关键字。
- 委托注册使用 “=” 或 “+=” 运算符,而注册事件只能使用 “+=” 。
- 事件应该由事件发布者触发,而不应该由事件的客户端(客户程序)来触发。
例子
//事件发布者
public class GreetingManager
{
//声明一个委托变量。(继承自System.MulticastDelegate->System.Delegate->object)
public delegate void GreetingDelegate(string name);
//声明一个事件。(声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已)
public event GreetingDelegate Greeting;
//创建一个处理方法
public void GreetingPeople(string name)
{
//1、防止在event还没注册时就被调用
if (Greeting!=null)
{
//触发事件
Greeting(name);
}
//2、还可以使用null条件运算符
//Greeting?.Invoke(name);
}
}
//订阅者
public class GreetingWays
{
public void EnglishGreeting(string name)
{
Console.WriteLine($"Good Morning,{name}");
}
public void ChineseGreeting(string name)
{
Console.WriteLine($"早上好,{name}");
}
}
internal class Program
{
static void Main(string[] args)
{
//创建一个发布者
GreetingManager greetingManager = new GreetingManager();
//创建一个订阅者
GreetingWays greetingWays = new GreetingWays();
//注册事件方法时不能使用"=",因为事件是由发布者出发的。(注册事件)
greetingManager.Greeting += greetingWays.EnglishGreeting;
//给匿名对象注册方法
greetingManager.Greeting += new GreetingWays().EnglishGreeting;
//也可以这么注册
greetingManager.Greeting += new GreetingManager.GreetingDelegate(greetingWays.EnglishGreeting);
//应该通过GreetingPeople()来触发事件
greetingManager.GreetingPeople("Mike");
Console.ReadKey();
}
}