我不明白为什么我们在定义事件时需要"event"关键字,而我们不需要使用"event"关键字,只需要使用委托就可以做同样的事情.

例如

public delegate void CustomEventHandler(int a, string b);
public event CustomEventHandler customEvent;
customEvent += new CustomEventHandler(customEventHandler);
customEvent(1,"a"); // Raising the event

在这里,如果我从第二行中删除"event"关键字,那么我还可以通过调用委托来引发事件.有人能告诉我为什么需要这个事件关键字吗?

推荐答案

类字段事件和委托类型的公共字段非常相似,但实际上非常不同.

事件基本上就像一个属性——它是一对添加/删除方法(而不是属性的get/set).当您声明一个类似字段的事件(即,您自己没有指定添加/删除位的事件)时,将创建一个公共事件和一个私有备份字段.这允许您私下发起活动,但允许公开订阅.使用公共委托字段,anyone可以删除其他人的事件处理程序,自己引发事件,等等——这是一场封装灾难.

有关活动(和代表)的更多信息,请阅读my article on this topic.(在某个时候,我需要为C#4更新它,它会像事件一样轻微地改变字段.尽管它的要点仍然是正确的.)

.net相关问答推荐

使用 PostAsJsonAsync C# 时出现错误请求

MongoDB GridFs with C#,如何存储图片等文件?

在.NET C#中截断整个单词的字符串

如何从控制台应用程序中的 Task.WaitAll() 获取返回值?

如何解决请确保文件可访问并且它是有效的程序集或 COM 组件?

C# 的部分类是糟糕的设计吗?

有没有办法以编程方式最小化窗口

如何 Select 数据表中列的最小值和最大值?

IEnumerable Count() 和 Length 的区别

如何使用c#从excel文件中读取数据

处理序列没有元素异常

如何创建只读依赖属性?

找不到 Assert.Fail 和 Assert.Pass 或等效项

测试没有预期的异常

监听依赖属性的变化

等待 Async Void 方法调用以进行单元测试

如何从 WCF REST 方法返回自定义 HTTP 状态代码?

从字节数组中读取 C# 中的 C/C++ 数据 struct

obj 文件夹是为了什么而生成的?

判断数据表中是否包含空值的最佳方法