代码之家  ›  专栏  ›  技术社区  ›  Shane Miskin

VB.NET:即使没有事件处理程序,是否引发事件?

  •  8
  • Shane Miskin  · 技术社区  · 17 年前

    我有一个类可以下载、检查和保存一些大型XML文件。有时我希望用户界面告诉我发生了什么,但有时我会使用类并忽略事件。所以我在很多地方放置了这样的代码行:

    RaiseEvent Report("Sending request: " & queryString)
    
    RaiseEvent Report("Saving file: " & fileName)
    
    RaiseEvent Report("Finished")
    

    我的问题是,如果没有人在听,这些事件会减慢我的代码速度吗?他们还会开火吗?

    4 回复  |  直到 13 年前
        1
  •  6
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

    没有魔力,隐藏在raiseEvent下的代码完全按照您期望的方式工作,它迭代一组处理程序,并执行每个处理程序。 检查是否有任何处理程序的开销都很小,不用担心。

    如果你 真实的 问题是“为了节省时间,我应该在引发事件之前检查事件是否有处理程序?”…那么答案是“不”,这样做你什么也得不到。

    另外,不要担心优化,除非你需要(看这个 Wikipedia entry 看看为什么。

    重新呼叫 GetMystring() .

    是的,这与您如何在C中引发事件有关,在C中,您在引发事件之前检查处理程序的存在性。 例如。:

    if (MyEvent != null)
        MyEvent(GetMyString())
    

    顺便说一句,实验很好。)

        2
  •  7
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

    我自己的答案:

    在vb.net中,如果没有设置用于侦听事件的处理程序,则事件不会激发。

    我做了一个小实验,在这个实验中,引发事件的代码将传递一个函数的结果,这个函数只在设置了一个事件处理程序来处理事件时执行。

    RaiseEvent Report(GetMyString())
    

    换句话说,我是说 GetMystring 除非实际存在处理程序,否则不会调用上面的函数。

        3
  •  1
  •   Joel Coehoorn    17 年前

    可能会有少量的开销,但我不担心。当然,实际行动将是性能驱动因素。

    附带说明:在C中不使用处理程序引发事件实际上会导致引发异常。vb.net没有此问题:)

        4
  •  0
  •   user1739635    13 年前

    如果你真正的问题是“节省时间,我应该检查一下 在引发事件之前有处理程序吗?”…那么答案是 “不”,这样做你什么也得不到。

    在C中,如果不检查事件是否为空,并且没有注册的处理程序,则会得到一个NullReferenceException。

    推荐文章