[英].NET events - blocking subscribers from subscribing on an event
假設我有一個暴露事件的“處理器”接口 - OnProcess。 通常,實現者進行處理。 因此,我可以安全地訂閱此事件,並確保它將被解雇。 但是一個處理器不進行處理 - 因此我想阻止訂閱者對其進行處理。 我能這樣做嗎? 換句話說,在下面的代碼中,我希望最后一行拋出異常:
var emptyProcessor = new EmptyProcessor();
emptyProcessor.OnProcess += event_handler; // This line should throw an exception.
class EmptyProcessor : IProcessor {
[Obsolete("EmptyProcessor.OnProcess should not be directly accessed", true)]
public event EventHandler OnProcess {
add { throw new NotImplementedException(" :( "); }
remove { }
}
}
在這種情況下,Obsolete上的true
參數會導致編譯時異常。 所以:
EmptyProcessor processor1 = new EmptyProcessor();
IProcessor processor2 = new EmptyProcessor();
processor1.OnProcess += handler; // <-- compile-time error
processor2.OnProcess += handler; // <-- run-time error
您可以使用自定義add
/ remove
方法實現它,但我相信這是一個不好的做法。
看,你有一個接口 ,一個由不同類實現的契約 。
OnProcess
是本合同的一部分,並沒有任何特殊之處。
當她想在同一組操作下使用不同的類時,通常使用接口。 接口允許您像這樣編碼:
IProcessor proc = GetProcessorAnyhow ();
proc.DoSomething ();
在編譯類型時不知道具體類型。
但是,按照你的方法,
IProcessor proc = GetProcessorAnyhow ();
proc.OnProcess += (sender, e) => { };
可能會失敗沒有任何明顯的原因,雖然它看起來像絕對合法的代碼。
始終確保錯誤的代碼看起來錯誤 。
您可能已經完成了以下設計錯誤之一:
OnProcess
放在IProcessor
而它可能不是每個處理器的合同 ; EmptyProcessor
實現了IProcessor
,但實際上它不能滿足合同 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.