[英]When chaining .NET delegates, how are the original instances (re)used?
說我有以下C#代碼:
Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;
測試表明b
與c
不是同一個實例,所以顯然+
運算符似乎創建了一個新的委托實例。 這是正確的假設嗎? 它是在內部重用b
-instance,還是僅將方法/目標信息復制到新實例?
我似乎無法找到代理的+
運算符的實現,Delegate類似乎不包含它。
任何人都可以對這個問題有所了解嗎?
我問的原因是我正在創建一些類,它們將像洋蔥一樣彼此分層,最外層將調用內層,獲取一些代理,然后將更多方法附加到這些代理,我只是我擔心這樣做會以某種方式改變我從內層獲得的委托,在這種情況下我需要返回副本/克隆,而不僅僅是內部引用。
請注意,這是我的庫的完全內部代碼,所以雖然我知道傳遞這樣的內部數據結構通常是一個壞主意,如果我可以安全地使用這些類,那么我會這樣做。
+=
等同於Delegate.Combine()
。 -=
等同於Delegate.Remove()
。 每個都創建一個新的Delegate
實例並返回它。
正如Kent所說,+ =使用Delegate.Combine
,而 - =使用Delegate.Remove
。 有關詳細信息,請參閱我的活動/代表文章 。
重要的是委托是不可變的 - 調用Combine / Remove不會改變你調用它的委托 - 所以你不需要克隆任何東西。 對於委托的其他任何操作都是如此:例如,如果獲得調用列表並更改返回數組的內容,則不會更改委托實際執行的操作。
(這就像String的行為,如果你想要另一種思考方式。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.