委托和事件

一、委托

在 C# 中,委托(Delegate)是一种类型,它可以存储对方法的引用并允许将方法作为参数传递、返回方法以及以委托类型调用方法。委托在事件处理、回调函数、LINQ 查询、多线程编程等方面起着重要作用。

1. 定义委托:

可以使用 delegate 关键字定义委托类型,指定委托的方法签名(返回类型、参数列表)。例如:

delegate void MyDel(string message);

2. 实例化委托:

可以使用委托所定义的方法签名实例化委托,并将其指向具有相同签名的方法。例如:

MyDel delegateInstance = SomeMethod;

3. 调用委托:

通过委托实例调用方法,委托会将参数传递给其所引用的方法。例如:

delegateInstance("Hello, World!");

4. 委托的多播:

委托可以包含对多个方法的引用,这样调用委托时会依次调用这些方法。例如:
 

MyDel multiDelegate = SomeMethod1;
multiDelegate += SomeMethod2;
multiDelegate += SomeMethod3;
multiDelegate("Multiple methods");
// 依次调用委托,但返回最后一个委托的结果

5. 内置委托:

C# 提供了一些内置委托类型,如 Action (无返回值,可接受多个输入参数)、 Func(有返回值,可接受多个输入参数)等,方便在不定义自定义委托时使用。

6. 匿名方法:

可以通过匿名方法来创建不具名的方法,用于传递给委托或事件处理程序中使用。例如:

MyDel delegateInstance = delegate (string message) {
	Console.WriteLine(message); 
}; // 后面要带;

7. Lambda 表达式:

Lambda 表达式是一种更简洁的方式来表示匿名方法,可以用于简化委托的实例化。例如:

Lambda表达式中delegate关键字是多余的,因此可以删除

编译器可以从委托的声明中知道委托的参数类型,因此Lambda表达式还可以省略参数类型,称之为隐式类型

如果只有一个隐式类型参数,还可以省略周围小括号

如果语句只有包含一个返回语句,那么return也可以省略

MyDel del1 = delegate(int x){return x+1;}; //匿名函数
MyDel del2 =(int x)=>{return x+1;}; //Lambda表达式
MyDel del3 =(x)=>{return x+1;}; //Lambda表达式
MyDel del4 =x=>{return x+1;}; //Lambda表达式
MyDel del5 =x=>x+1; //Lambda表达式

通过理解和熟练运用委托,你可以实现回调函数、事件处理、异步编程等许多功能。委托可以帮助实现更灵活、可扩展的代码结构,提高代码的模块化和可重用性。

二、事件

在 C# 中,事件(Event)是一种特殊的委托,用于实现发布-订阅模式,使对象之间能够进行松耦合的通信。事件允许一个对象通知其他对象发生了特定的动作或状态变化,其他对象则可以订阅该事件并在事件发生时作出响应。如下是一些相关概念:

1. 声明事件:

事件通常声明在包含事件的类中,可以使用 event 关键字声明事件。例如:

public event EventHandler MyEvent;

2. 订阅事件:

对象可以订阅事件,以便在事件被触发时执行相应的操作。可以通过 += 运算符将方法添加到事件的委托链中。例如:

someObject.MyEvent += MyEventHandlerMethod;

3. 触发事件:

声明事件的类不直接调用事件处理方法,而是通过触发事件的方式通知订阅者。可以通过调用事件的委托实例来触发事件。例如:

MyEvent?.Invoke(this, EventArgs.Empty);
// ?. 是条件访问操作符(null-conditional operator),它是在C# 6.0 中引入的一项特性,用于简化对可空对象成员的访问。
// 当你使用 ?. 时,它会首先检查目标对象是否为 null。如果目标对象是 null,则整个表达式的值将会是 null,而不会引发 NullReferenceException 异常。如果目标对象不是 null,则会正常访问其成员。

4. 事件处理方法:

事件处理方法通常具有特定的签名,可以是匹配事件委托的任意方法。例如,EventHandler 委托的签名为 void EventHandler(object sender, EventArgs e)
 

5. 事件附加的参数:

在触发事件时,通常会传递一些信息给事件处理方法。可以自定义事件参数类来携带相关信息,并在触发事件时传递给订阅者。
 

6. 移除事件订阅:

对象可以通过 -= 运算符将事件处理方法 从事件的委托链中移除。这样,事件被触发时不会再调用已移除的方法。

7. 内置事件:

在 .NET 中有一些内置事件,比如 Click 事件、 TextChanged 事件等,常用于 GUI 编程和用户交互操作。
 


通过使用事件,可以实现对象之间的松耦合方式进行通信,提高代码的可维护性和灵活性。事件使得对象之间的交互更清晰、易于理解,并且方便实现观察者模式等设计模式。深入理解事件的机制和用法将有助于编写更规范、可扩展的 C# 代码。

 

 

 

 

 

 

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录