事件是基于委托的概念,委托基本上是一个方法签名的定义。就这样。就像在一个界面中你如何定义方法签名一样,但是你没有实现它们,你可以在所有继承该接口的类中这样做。
委托是一个方法签名的定义,以及您可以定义为许多方法身体是你喜欢的,例如,鉴于这一委托(方法签名的定义):
public delegate void ChangingHandler (object sender, CarArgs ca);
您可以定义与此委托(方法签名的定义),因为这些机构:
public void SomeMethodWhichCreatesADelegateBody()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
}
这虽然定义为代表的老风格,现在它更具可读性,而不是使用委托关键字的lambda表达式像我一样创建方法体,但这对于这些并不重要 问题。
现在可以将事件想象成一个委托(方法签名定义),其中包含一个body数组,用于订阅事件,订阅方法体的语法为+=
,还有用于从事件的订阅是-=
所以这里这个代码定义身体为ChangingHandler委托阵列(方法签名的定义)去除的方法体:
public event ChangingHandler Change;
而且你可以订阅身体的(它们添加到数组)通过calli进行分组NG的方法:
public void SomeMethodWhichSubscribesADelegateBodyToAnEvent()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
Change += myChangingHandler;
}
现在的全部理由进行这项活动,有法人体的,只要你想,你去定义和添加的数组,就是这样,每当一个事件发生在物体内部谁拥有该事件,该对象可以执行所有这些方法,以便在该事件发生时执行您想要完成的任何操作。拥有该对象的对象的确如此:
if (Change != null) // You wouldn't access an array without making sure it wasn't null, would you?
{
Change(this, new CarArgs()); // This executes every method body in it's array using the signature definition the delegate defined.
// The delegate simply exists so this code knows the method signature
// so it can know how to call those method body's for you.
}
请注意,您不需要显式创建委托实例。你可以做'car.Change + = car_Change;'(这非常习惯) – bruceboughton 2010-08-23 15:00:11