C#委托与事件:为何返回值通常为void?

需积分: 16 6 下载量 154 浏览量 更新于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可以避免复杂的值处理逻辑,并保持发布者和订阅者之间的松耦合。