[英]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.