C#入门:委托与事件详解及Observer模式应用
需积分: 7 156 浏览量
更新于2024-07-27
2
收藏 68KB DOCX 举报
"C#委托与事件的经典讲解"
在C#编程语言中,委托和事件是核心概念,尤其在.NET Framework中扮演着重要角色。本文将深入探讨这两个概念,帮助开发者更好地理解和应用。
首先,让我们从委托开始。委托可以被视为指向方法的引用,它允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种特性使得代码更具灵活性和可扩展性。在上述示例中,`GreetPeople`方法原本直接调用了`EnglishGreeting`,但为了实现多语言支持,我们需要根据传入的`Language`枚举值选择调用`EnglishGreeting`或`ChineseGreeting`。这时,委托就派上用场了,它允许我们将决定权交给调用者,让调用者决定使用哪种语言的问候。
在C#中,委托类型是通过关键字`delegate`定义的。例如,我们可以创建一个名为`GreetingDelegate`的委托类型,它接受一个字符串参数并返回无类型(void):
```csharp
public delegate void GreetingDelegate(string name);
```
然后,我们可以将`EnglishGreeting`和`ChineseGreeting`方法赋值给`GreetingDelegate`类型的变量,这样就可以根据需要调用它们:
```csharp
GreetingDelegate greet = EnglishGreeting;
greet("Jimmy"); // 输出 "Morning, Jimmy"
greet = ChineseGreeting;
greet("Jimmy"); // 输出 "早上好, Jimmy"
```
接下来,我们谈谈事件。事件是委托的一种特殊用法,通常用于实现观察者模式,允许对象在特定状态改变时通知其他对象。在.NET Framework中,事件通常与控件或组件的交互有关,例如按钮点击事件或数据更改事件。事件的发送者(源)持有事件,而事件的接收者(订阅者)注册监听这些事件。
事件的声明通常包含两个部分:一个私有的委托实例(事件处理程序)和一个公开的添加和移除事件处理程序的方法。例如:
```csharp
public event GreetingDelegate OnGreeting;
// 添加事件处理程序
public void AddGreetingHandler(GreetingDelegate handler) {
OnGreeting += handler;
}
// 移除事件处理程序
public void RemoveGreetingHandler(GreetingDelegate handler) {
OnGreeting -= handler;
}
```
订阅者可以通过调用这些方法来注册或取消注册事件处理程序。当事件触发时,所有已注册的事件处理程序都会被调用。例如:
```csharp
source.AddGreetingHandler(EnglishGreeting);
source.AddGreetingHandler(ChineseGreeting);
// 触发事件
source.OnGreeting("Jimmy");
```
在这个例子中,`OnGreeting`事件触发时,`EnglishGreeting`和`ChineseGreeting`都会被执行。这展示了事件如何在对象之间建立通信,而无需让这些对象直接相互依赖,从而遵循了松耦合的设计原则。
委托和事件在实现诸如用户界面响应、异步编程、多线程通信等场景中非常有用。它们是C#中强大的特性,理解并熟练使用它们能够提升代码的可读性和可维护性。通过本文的两个示例,你应该对委托和事件有了更清晰的认识,也能更好地应对实际开发中的各种需求。
106 浏览量
点击了解资源详情
点击了解资源详情
249 浏览量
2008-09-12 上传
123 浏览量
142 浏览量
178 浏览量
zzx_henu
- 粉丝: 2
- 资源: 1
最新资源
- matlab代码sqrt-SVMHeavy:创建SVM和东西,是因为上传在旧存储库上不起作用(旧版本由于某些原因而持续存在)
- numerical_mathematics
- 易语言枚举并预览系统字体
- iOS 13.2真机测试包
- BLDCM,svm算法在matlab源码,matlab源码网站
- TreatLife-HomeKit:TreatLife DS0X调光器开关的开源固件,可用于本机HomeKit
- creddit:[Android应用]使用Nativescript和VueJS制作的Android Reddit客户端
- matlab代码sqrt-MultiturnCoilDesigningTool:设计用于低频磁力计的线圈
- zaperin-hub:扎珀林模块的资料库
- (w3cschool.cc).rar
- dotfiles::memo:自己设置的dotfiles
- springboot-demo.zip
- Cekklik:Aplikasi Cek细节barang
- chainpack-rs:ChainPack RPC的Rust实现
- gei,Matlab输入HDB3码输出源码,matlab源码怎么用
- matlab代码sqrt-Hugo-Diaz-N.github.io:临时网站