2009-04-27 28 views
2

我在那里扔了这一点,就像好奇一个问题...C#中的事件或Lambdas?

假设你只希望/想了一个方法来提供,将这个让人不悦或不好的做法?

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...*/ }; 

我意识到这就像是作弊的事件,但我还有什么是坏对这种做法?从长远来看,这会对您的应用程序造成任何潜在的问题吗?

我意识到,如果你想要一个以上的方法来运行,那么事件会更好,这主要是,如果你只是想/期待一个方法的问题。

+0

你认为使用这种方法比使用事件有什么好处? – MichaC 2009-04-27 20:56:18

+0

我没有意识到 - 只是主要好奇,如果这是一个彻头彻尾的_wrong_方式来做到这一点。 – Hugoware 2009-04-27 21:56:56

回答

0

与事件,你不能做到这一点:

something.OnRemove = null; 

事件为您提供了一个包装,一种包装的同性质和属性,这样可以保证在委托方法封装。

+0

除非我没有记错,否则在分配处理程序之前,事件为空,这可能会导致相同的情况。 – Hugoware 2009-04-27 20:53:02

6

那么,最明显的问题是它暴露了公共领域。我至少会使用一个属性 - 无论如何,事件可能会更简单。它使用比代码更少的代码来提供更多的灵活性(因为您无法使用具有特定默认值的自动实现的属性)。

另一种替代方法是将其带入构造函数中,然后将其保留为专用只读字段。这可能是我真正想做的事情......是否真的有必要将行动公开为财产/领域?

1

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

这种方法唯一的缺点是以这种方式创建的处理程序不能轻易删除。通常你会说

something.OnRemove -= SomeEvent; 

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

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

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

但是只要你只想添加,这不是问题。

1

它可能暴露超过你想要的。通常,事件不允许客户检查支持该事件的MulticastDelegate的内容。

1

我认为这种方法没问题,它只是声明一个委托的一种简便的方式(查看Action系列的定义)。