首页 新闻 会员 周边

事件需要显示实现add/remove吗?

0
悬赏园豆:20 [已关闭问题]

在很多情况下,使用事件时直接:

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);
        }

这二种有什么区别呢?

yibin的主页 yibin | 初学一级 | 园豆:17
提问于:2008-12-08 14:38
< >
分享
其他回答(3)
0

MyDelegate 委托定义更灵活一些,你可以给这个委托定义任何类型,任意个的参数。

玉开 | 园豆:8822 (大侠五级) | 2008-12-08 15:08
0

楼主看下《C#技术内幕》吧,上面有关于委托链的使用说明

上不了岸的鱼 | 园豆:4613 (老鸟四级) | 2008-12-08 18:00
0

应该不需要吧,那些应该是类库里面做法.比如看.net里面的源码也是这样.

波波塔 | 园豆:638 (小虾三级) | 2008-12-08 19:39
1

这要看情况,如果你在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章有解释

要有好的心情 | 园豆:502 (小虾三级) | 2008-12-10 22:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册