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

C#中的事件或lambda?

  •  2
  • hugoware  · 技术社区  · 17 年前

    我把这个扔出去只是出于好奇。。。

    ,这是不赞成还是反对

    public class Something  {
        public Action OnRemove = () => { };
        public Action<object, EventArgs> OnFinishedLoading = (sender, e) => { };
    }
    
    // then used like...
    something.OnRemove = () => { /*do something...*/ };
    something.OnFinishedLoading = (sender, e) => { /*do something else...*/ };
    

    我意识到这就像在活动中作弊,但我知道这种方法有什么不好的地方吗?从长远来看,这是否会导致应用程序出现任何潜在问题?

    我知道如果你想运行不止一个方法,那么一个事件会更好,这主要是一个问题,如果你只想/期望一个方法。

    5 回复  |  直到 17 年前
        1
  •  6
  •   Jon Skeet    17 年前

    嗯,最明显的“错误”是它暴露了公共领域。我至少会使用一个属性——在这一点上,事件可能会更简单。与属性相比,它以更少的代码提供了更大的灵活性(因为不能使用具有特定默认值的自动实现属性)。

        2
  •  1
  •   JaredPar    17 年前

    这种方法没有错,我经常使用。它使简单的处理程序有简单的代码(这是一件好事)。

    这种方法唯一的缺点是,用这种方法创建的处理程序不容易删除。通常你会说

    something.OnRemove -= SomeEvent;
    

    但并非所有lambda表达式都是这样。文本相等的lambda表达式几乎肯定会有单独的实现,因此在添加和删除事件处理程序时不会匹配。

    例如,以下代码将无法删除处理程序。

    something.OnRemove += () { MessageBox.Show("Removed!"); }
    something.OnRemove -= () { MessageBox.Show("Removed!"); }
    

    但只要你只想补充,这不是问题。

        3
  •  1
  •   Jeffrey Hantin    17 年前

    它可能会暴露出比你想要的更多的信息。通常,事件不允许客户端检查 MulticastDelegate 支持这一事件。

        4
  •  1
  •   Richard    17 年前

        5
  •  0
  •   Jhonny D. Cano -Leftware-    17 年前

    在活动中,您不能这样做:

    something.OnRemove = null;