C#:了解事件语法

标签 c#

我需要一些帮助来了解如何创建新的自定义事件。我读自here ...

public delegate void ChangingHandler (object sender, CarArgs ca); 
public event ChangingHandler Change; 
...
private void car_Change(object sender, CarArgs ca) {
    MessageBox.Show(ca.Message());
} 
...
car.Change+=new Car.ChangingHandler(car_Change); // add event handler
...
Change(this,ca); // call event

第一,我不太了解代表部分。在一个普通的变量声明中,

protected string str1;

但这里我有额外的 (ChangingHandler)。我怎么理解这个?我知道它类似于 ChangingHandler 的东西将用于处理事件,但它让我有点失望。

public event ChangingHandler Change

然后

car.Change+=new Car.ChangingHandler(car_Change)

我真的不明白语法 new Car.ChangingHandler(car_Change)

最佳答案

C# 中的事件有点像方法指针的集合。它说“嘿大家,如果你关心我,给我一个我可以调用的方法的指针,我会坚持下去,当我想向世界宣布发生了什么时,我会调用所有的方法你给了我。”

这样,某人就可以为事件提供指向他们的方法的指针,这被称为“事件处理程序”。只要事件所有者认为合适,事件就会调用此方法。

从这个意义上说,委托(delegate)无非是说事件将接受什么样的方法。你不能让一个人为事件提供一个不带参数的方法和一个带 5 个参数的方法,它不知道如何调用它们。所以委托(delegate)是事件和事件处理程序之间的契约,告诉他们双方对方法签名的期望。

在您的情况下,最好只使用 EventHandler<T> ,这是一个内置委托(delegate),形式为 void EventHandler<T>(object sender, T eventArgs)对于您的事件委托(delegate),像这样:

public event EventHandler<CarArgs> Change;

C# 实际上并没有原始意义上的函数指针。代表处理这个。它们就像强类型的、面向对象的函数指针。当你打电话时

car.Change+=new Car.ChangingHandler(car_Change);

您正在为该事件提供一个指向您的 car_Change 事件处理程序的新委托(delegate)(函数指针),告诉该事件在准备就绪时调用您的 car_Change 方法。委托(delegate)(new ChangeHandler(...) 只是将指向 car_Change 方法的指针包装起来。

关于C#:了解事件语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3548242/

相关文章:

c# - 夏令时的灰色地带

c# - Visual Studio 引用不再存在的命名空间

c# - 在 .NET 中寻找简单的规则引擎库

C# 从正确的文本框中选择文本

c# - 并行数组 C#

C# 对象初始化程序将初始化只读属性,但仅适用于非原始类型

c# - C# travis 的问题

c# - 如何仅选择一列以返回linq中的对象

c# - 从用户控件代码隐藏,在设计模式下,如何获取父控件中包含的所有控件名称?

c# - 什么是最有效的时间测量方法?