代码之家  ›  专栏  ›  技术社区  ›  MichaC

C中的事件调用方#

  •  6
  • MichaC  · 技术社区  · 16 年前

    当我在Visual Studio中实现一个事件时,Resharper非常友好,可以为我创建一个事件调用器。过去我通常是用手做的,我的调用者总是这样。

        private void InvokePropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, e);
            }
        }
    

    但是Resharper创建的调用程序看起来是这样的(用手清理了一点)

        private void InvokePropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler changed = PropertyChanged;
    
            if (changed != null)
            {
                changed(this, e);
            }
        }
    

    JetBrains的人知道一些关于C的事情吗?我不知道?拥有局部变量是否有一些技术上的优势,或者仅仅是它们必须自动生成代码的产物?

    3 回复  |  直到 16 年前
        1
  •  8
  •   John Saunders    16 年前

    对。他们知道一个事件的订阅者数量可以在“if”和对事件处理程序的调用之间变化。他们在一个地方捕捉到它,在那里它不再改变。

        2
  •  5
  •   Brian Genisio    16 年前

    我认为约翰桑德斯可能有最好的答案。

    作为记录,我甚至不再写“调用者”了。我有一些扩展方法可以为我做,我只是调用 PropertyChanged.Fire(this, "propName");

    this article 更多信息。

        3
  •  1
  •   Reed Copsey    16 年前

    这只是多线程处理的问题。这样可以在多线程环境中保护您。

    例如,以这个场景为例:

    if (PropertyChanged != null) // PropertyChanged has one subscriber here
    {
    

    现在,第二个线程在这里取消订阅,修改事件处理程序…

        PropertyChanged(this, e); // This is no longer valid!
    }