0
点赞
收藏
分享

微信扫一扫

CSharp(C#)语言_委托和事件区别详解


委托和事件区别详解

  • ​​委托和事件的概念​​
  • ​​委托​​
  • ​​事件​​
  • ​​委托和事件的作用​​
  • ​​委托​​
  • ​​事件​​
  • ​​委托和事件的区别​​
  • ​​委托和事件的详细解答请看C#系列文章​​
  • ​​委托和事件代码实践​​
  • ​​委托​​
  • ​​事件​​
  • ​​总结​​

委托和事件的概念

委托

  C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。它本质上也是一个类。

  • 它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法

事件

  事件由对象引发,通过我们提供的代码来处理。一个事件我们必须订阅(Subscribe)他们,订阅一个事件的含义就是提供代码,在这个事件发生时执行这些代码,这些代码称为事件处理程序。

  事件是在委托类型变量前加上 ​​event​​ 关键字,其本质是用来对委托类型的变量进行封装,类似于类的属性对字段的封装。

委托和事件的作用

委托

  可以把方法当参数传递,可以避免在程序中大量使用 ​​if-else(switch)​​​ 语句,同时使得程序具有更好的可扩展性。C#2.0 之后出现了 ​​匿名函数​​​ 和 ​​lambda表达式​​​ 也是 ​​Delegate​​ 演化而来。

事件

  事件的使用一般通过发布者和订阅者来进行。发布者会在某一条件下触发某事件,订阅者可以通过订阅该事件,来对该事件的触发做出反应。

  • 在设计模式中的订阅者模式是最佳实践

委托和事件的区别

1、事件是委托的封装

2、事件里面其实就是两个方法(即 ​​add_event()​​​ 和 ​​remove_event()​​)和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的 ​​+=​​​ 时其实是调用的事件里面的 ​​add_event()​​​ 方法,同样 ​​-=​​​ 调用的是 ​​remove_event()​​ 方法。

3、在注册和注销事件上:
委托可以使用 ​​​=​​​ 和 ​​+=​​​ 来将函数注册到委托的变量上,使用 ​​-=​​​ 来将函数注销。
事件则有着更严格的限制,事件只能使用 ​​​+=​​​ 来将函数注册到其上,使用 ​​-=​​ 来将函数注销。

委托和事件的详细解答请看C#系列文章

​​CSharp(C#)语言_第十一章(委托)​​CSharp(C#)语言_第十二章(事件)

委托和事件代码实践

委托

  • “中国人和外国人问候” —— 经典面试题

internal class Program
{
static void Main(string[] args)
{
CallDelegate("王二狗", SayChinese);
CallDelegate("Tom", SayEnglish);
}

/// <summary>
/// 声明委托
/// </summary>
/// <param name="name"></param>
public delegate void DelegateSayHi(string name);
/// <summary>
/// 声明委托调用方法
/// </summary>
/// <param name="name"></param>
/// <param name="sayHi"></param>
public static void CallDelegate(string name, DelegateSayHi sayHi) => sayHi(name);

/// <summary>
/// 声明实现方法
/// </summary>
/// <param name="name"></param>
public static void SayChinese(string name)
{
Console.WriteLine($"你好,{name}");
}

/// <summary>
/// 声明实现方法
/// </summary>
/// <param name="name"></param>
public static void SayEnglish(string name)
{
Console.WriteLine($"Hello,{name}");
}
}

CSharp(C#)语言_委托和事件区别详解_开发语言

事件

  • “猫叫、老鼠跑了,主人醒来了” —— 经典面试题

internal class Program
{
static void Main(string[] args)
{
Mouse();
People();
Scream();
}

/// <summary>
/// 声明委托
/// </summary>
public delegate void DelegateScream();

/// <summary>
/// 声明事件
/// </summary>
public static event DelegateScream OnScream;

public static void Scream()
{
Console.WriteLine("猫叫了一声");
OnScream?.Invoke();
}

public static void Mouse()
{
OnScream += () =>
{
Console.WriteLine("老鼠跑了");
};
}

public static void People()
{
OnScream += () =>
{
Console.WriteLine("主人醒了");
};
}
}

CSharp(C#)语言_委托和事件区别详解_c#_02

总结

事件是一种特殊的委托,事件的最佳实践为订阅者模式。委托可以将函数作为参数传递,消除了很多不必要的判断,增强了程序的健壮性和可扩展性。熟练并掌握委托和事件,有助我们写出更优雅、易读且性能优越的代码。


举报

相关推荐

0 条评论