2009-04-27 55 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系列的定義)。