C#委托与事件:为何返回值通常为void?
需积分: 16 83 浏览量
更新于2024-08-19
收藏 355KB PPT 举报
"本文主要探讨了C#中的委托和事件,特别是为什么委托定义的返回值通常为void。委托是C#中的一种类型,类似于类、接口、结构体和枚举,且是引用类型。它们主要用于封装对方法的调用,允许在不关心具体方法归属的情况下调用方法。在定义委托时,通常设定返回值为void,因为在一个事件中有多个订阅者,如果都返回值,只会获取到最后一个方法的返回值,而且发布者通常不关心订阅者的返回值。文章通过代码示例展示了如何定义、实例化和调用委托,以及委托在事件处理中的应用。事件是类对外界发生的动作或状态改变的通知,事件处理程序通过委托关联。在C#中,控件事件通常使用EventHandler委托类型。"
委托是C#中一个强大的特性,它允许我们将方法作为参数传递或者存储在变量中。委托是一种引用类型,继承自System.Delegate类,但不能直接从System.Delegate派生新的类。定义一个委托类型,需要指定返回值类型和参数列表,这与定义方法类似。例如:
```csharp
public delegate string GeneralEventHandler();
```
在这个例子中,GeneralEventHandler代表一个返回字符串并可能接受参数的方法。
实例化一个委托,我们需要指定要调用的方法所在的对象和方法名称,如:
```csharp
GeneralEventHandler myDelegate = new GeneralEventHandler(sub1.OnNumberChanged);
```
这里,myDelegate是一个GeneralEventHandler实例,它将调用Subscriber1类的OnNumberChanged方法。
调用委托就像调用普通方法一样,传入适当的参数:
```csharp
myDelegate(someValue);
```
事件是类的一种成员,它通过委托与其他类的方法关联,当事件触发时,关联的委托会调用相应的方法。在C#中,声明事件使用`public event`关键字,例如:
```csharp
public event GeneralEventHandler NumberChanged;
```
然后,其他类可以订阅这个事件,将事件处理方法绑定到事件:
```csharp
pub.NumberChanged += new GeneralEventHandler(sub1.OnNumberChanged);
```
当触发事件(如`pub.DoSomething()`),所有已订阅的事件处理程序会被依次调用。由于事件处理通常是异步的,因此返回值通常是void,因为发布事件的一方通常不关心处理程序的执行结果。
此外,C#中控件事件如Click、Enter、KeyPress等通常使用EventHandler委托,它定义了无参数的方法签名:
```csharp
public delegate void EventHandler(object sender, EventArgs e);
```
在这里,sender参数是引发事件的对象,而EventArgs是一个通用的参数类,通常用于携带额外的事件信息。
C#中的委托和事件提供了一种安全、灵活的方式来处理方法调用和事件响应,特别是在多订阅者场景中,返回值设为void可以避免复杂的值处理逻辑,并保持发布者和订阅者之间的松耦合。
2009-09-02 上传
2008-12-18 上传
2011-03-05 上传
2008-09-25 上传
2013-10-24 上传
2012-04-22 上传
2011-09-20 上传
2010-06-24 上传
2010-09-11 上传
八亿中产
- 粉丝: 27
- 资源: 2万+