簡體   English   中英

C#中的事件或Lambda?

[英]Events or Lambdas in C#?

我把它扔出去只是好奇心的問題......

假設你只是期望/想要提供一種方法 ,這是不贊成還是不好的做法?

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

我意識到這就像在事件中作弊一樣,但我對這種方法有什么不好的意思嗎? 從長遠來看,這是否會導致您的應用程序出現任何潛在問題?

我意識到如果你想要運行多種方法,那么事件會更好,這主要是一個問題,即你是否只想要/期望一種方法。

嗯,最明顯的“錯誤”是它揭露了公共領域。 我至少使用了一個屬性 - 此時事件可能會更簡單。 它使用比屬性更少的代碼提供更大的靈活性(因為您無法使用具有特定默認值的自動實現的屬性)。

另一種方法是將它放在構造函數中,然后將其保存為私有只讀字段。 這可能是我真正傾向於做的事情......是否真的需要將行動作為財產/領域公開?

這種方法沒有任何問題,我經常使用它。 它使簡單的處理程序具有簡單的代碼(這是一件好事)。

這種方法的唯一缺點是以這種方式創建的處理程序不能輕易刪除。 通常你會說

something.OnRemove -= SomeEvent;

但是所有lambda表達式都不是這種情況。 文本上相等的lambda表達式幾乎肯定會有單獨的實現,因此不會匹配添加和刪除事件處理程序的目的。

例如,以下代碼將無法刪除處理程序。

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

但只要您只想添加,這不是問題。

它可能會暴露出比你想要的更多。 通常,事件不允許客戶端檢查支持事件的MulticastDelegate的內容。

我認為這種方法很好,它只是一種聲明委托的簡便方法(看看Action系列的定義)。

有了這個事件,你不能這樣做:

something.OnRemove = null;

這些事件為您提供了一個包裝器,一種包含屬性和屬性的包裝器,因此您可以確保對Delegate方法進行封裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM