请教一个C#定义Event的问题

来源:百度知道 编辑:UC知道 时间:2024/07/05 20:05:28
请问
public event behindClickEventHandler behindClick;

public event behindClickEventHandler behindClick
{
add
{
Events.AddHandler(MyObj, value);
}
remove
{
Events.RemoveHandler(MyObj, value);
}
}
二者的区别是什么?后面的那个什么意思?
谢谢大家的回答。还想问一下,为什么使用后面那种方法时。
behindClick!=null时会报错。它是否定义了behindClick事件,还是只是在定义add和remove方法?

前一个是定义了一个behindClickEventHandler,这样做的话默认实现了下面的add,remove之类代码,即默认的添加,删除事件处理器逻辑。
后面一个是定义了一个behindClickEventHandler并且定义了添加删除事件处理器的代码。

如果向第二个那样写的话,可以简写成第一个的形式,而不需要手动写add,remove。不过,当你需要在添加或删除事件的时候做一些其他的操作(比如记录日志)就需要手动写add和remove了。以下的例子是在添加,删除事件处理器的时候记录日志的代码:

public event behindClickEventHandler behindClick
{
add
{
Console.WriteLine("ADD EVENT");
Events.AddHandler(MyObj, value);
}
remove
{
Console.WriteLine("REMOVE EVENT");
Events.RemoveHandler(MyObj, value);
}
}

Ps: 这里只是定义了添加和删除eventhandler的方法而没有初始化behindClick本身。你可以简单的用property的定义来类比event的定义。

C#编译器为事件的add和remove方法增加[MethodImpl (MethodImplOptions.Synchronized)]属性。这个属性的目的是为了确保在操作实例的事件成员时,对于任何一个对象,在同一时刻只能有一个add方法或者remove方法可以执行。该属性同样确保在操作静态事件成员时,同一时刻也只能有一个add方法或者remove方法可以执行。这里需要线程同步,以免委托对象的链表被破坏。但应注意,CLR实现线程同步的方式中存在许多问题。

对实例(非静态)方法应用MethodImpl属性时,CLR使用对象本身作为线程同步锁。这意味着如果类定义了许多事件,那么所有的add和remove方法都将使用相同的锁,这种情况