在很多情况下,使用事件时直接:
public event EventHandler<CommentCancelEventArgs> AddingComment;
而在看一些代码时,发现是在类的内部声明一个委托类型的变量,然后提供add/remove来进行注册
public MyDelegate my;
public event MyDelegate OnDelegate
{
add
{
my += value;
}
remove
{
my -= value;
}
}
public void Do()
{
if (my != null)
my(this, EventArgs.Empty);
}
这二种有什么区别呢?
MyDelegate 委托定义更灵活一些,你可以给这个委托定义任何类型,任意个的参数。
楼主看下《C#技术内幕》吧,上面有关于委托链的使用说明
应该不需要吧,那些应该是类库里面做法.比如看.net里面的源码也是这样.
这要看情况,如果你在add/remove中有逻辑控制,可以如下这样写:
public event PropertyChangedEventHandler PropertyChanged
{
add
{
if (value.Method.IsPublic &&
(value.Method.DeclaringType.IsSerializable ||
value.Method.IsStatic))
_serializableChangedHandlers = (PropertyChangedEventHandler)
System.Delegate.Combine(_serializableChangedHandlers, value);
else
_nonSerializableChangedHandlers = (PropertyChangedEventHandler)
System.Delegate.Combine(_nonSerializableChangedHandlers, value);
}
remove
{
if (value.Method.IsPublic &&
(value.Method.DeclaringType.IsSerializable ||
value.Method.IsStatic))
_serializableChangedHandlers = (PropertyChangedEventHandler)
System.Delegate.Remove(_serializableChangedHandlers, value);
else
_nonSerializableChangedHandlers = (PropertyChangedEventHandler)
System.Delegate.Remove(_nonSerializableChangedHandlers, value);
}
}
这里,如果对象不可序列化,就不会序列化这个事件。
同时,如果一个类存在大量的事件,要使用add/remove ,可以避免 内存浪费,否则会生成大量的委托,《ASP.NET服务器控件与组件开发》第9章有解释