关于c#事件的一个小问题

cpxuvs 2016-05-31 09:50:34
一个发布者类里面的事件对象为什么要封装到一个方法里面调用。
这有什么用?
比如:MSDN里面的例子

class Publisher
{
public event EventHandler<CustomEventArgs> RaiseCustomEvent;

public void DoSomething()
{
OnRaiseCustomEvent(new CustomEventArgs("Did something"));
//本来把事件放在 OnRaiseCustomEvent()方法里面,已经够麻烦了,为什么还要放在这里面调用??
}

// Wrap event invocations inside a protected virtual method
// to allow derived classes to override the event invocation behavior
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
if (handler != null)
{
e.Message += String.Format(" at {0}", DateTime.Now.ToString());
handler(this, e);
}
}
}
...全文
205 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-06-01
  • 打赏
  • 举报
回复
至少 DoSomething(); 要比 OnRaiseCustomEvent(new CustomEventArgs("Did something")); 简洁的多
cpxuvs 2016-05-31
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
这个叫NVI模式,是一种固定的套路 http://wenku.baidu.com/link?url=aQFl5M1ZsHxrRh0AjvXrMCV_LDf_hhQo-E96yWioVfkzx3wjvkPBJXy0OxiC_nHNPLezT93CxYyOzWG7I51mu5UD2ZmOPrLTFGzwCjNwCla http://blog.csdn.net/ccnyou/article/details/7833935
大概看了一下链接,觉得里面讲的主要是子类对基类方法的重写。 我这里关心的的事件的设计模式,不是考虑子类是不是需要取消基类的监听。
cpxuvs 2016-05-31
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
首先,OnXXX方法是protected, 所以你无法从外部调用这个事件 其次,OnXXX方法有一个参数,而对很多调用者来说,并不清楚这个参数应该如何产生 所以如果开发中遇到问题是由上面2点引起的,那就需要这样一个封装
我觉得Onxxx方法,是不是protected的无所谓,事件本来就private,在外部使用的是事件属性,而这是个方法。 这个方法我觉得主要是为触发事件而存在的,当然封装也是必要的,提供检查和事件参数处理。
threenewbee 2016-05-31
  • 打赏
  • 举报
回复
这个叫NVI模式,是一种固定的套路 http://wenku.baidu.com/link?url=aQFl5M1ZsHxrRh0AjvXrMCV_LDf_hhQo-E96yWioVfkzx3wjvkPBJXy0OxiC_nHNPLezT93CxYyOzWG7I51mu5UD2ZmOPrLTFGzwCjNwCla http://blog.csdn.net/ccnyou/article/details/7833935
Poopaye 2016-05-31
  • 打赏
  • 举报
回复
首先,OnXXX方法是protected, 所以你无法从外部调用这个事件 其次,OnXXX方法有一个参数,而对很多调用者来说,并不清楚这个参数应该如何产生 所以如果开发中遇到问题是由上面2点引起的,那就需要这样一个封装
  • 打赏
  • 举报
回复
这可以作为一种“开发模式”来使用。 根据你的习惯来使用。比如说微软的.net 中默认的大量控件,其事件其实不是使用 EventHandler<CustomEventArgs> 这类方式来定义的,而是使用“事件数组”(EventList)的机制来定义的,以此来节省大量内存空间。 这些也是开发模式。而我们往往懒得使用微软的模式,或者有些“果粉”程序员干脆一听说是微软的编程模式就反感呢。
  • 打赏
  • 举报
回复
首先,如果有多个地方使用 OnRaiseCustomEvent,而传入的参数不同,则可以简化代码。 另外, 子类继承并扩展 Publisher 时,可以直接重写 OnRaiseCustomEven,例如写
class Publisher2: Publisher
    {
        override void OnRaiseCustomEvent(CustomEventArgs e)
        {
            if(!现在是睡眠时间())
            {
                    替换Message中的流氓字眼(e);
                    base.OnRaiseCustomEvent (e);
            }
        }
    }
这可以做一些“事件机制做不了的”事情。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧