簡體   English   中英

鏈接.NET委托時,原始實例(重新)如何使用?

[英]When chaining .NET delegates, how are the original instances (re)used?

說我有以下C#代碼:

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;

測試表明bc不是同一個實例,所以顯然+運算符似乎創建了一個新的委托實例。 這是正確的假設嗎? 它是在內部重用b -instance,還是僅將方法/目標信息復制到新實例?

我似乎無法找到代理的+運算符的實現,Delegate類似乎不包含它。

任何人都可以對這個問題有所了解嗎?

我問的原因是我正在創建一些類,它們將像洋蔥一樣彼此分層,最外層將調用內層,獲取一些代理,然后將更多方法附加到這些代理,我只是我擔心這樣做會以某種方式改變我從內層獲得的委托,在這種情況下我需要返回副本/克隆,而不僅僅是內部引用。

請注意,這是我的庫的完全內部代碼,所以雖然我知道傳遞這樣的內部數據結構通常是一個壞主意,如果我可以安全地使用這些類,那么我會這樣做。

+=等同於Delegate.Combine() -=等同於Delegate.Remove() 每個都創建一個新的Delegate實例並返回它。

正如Kent所說,+ =使用Delegate.Combine ,而 - =使用Delegate.Remove 有關詳細信息,請參閱我的活動/代表文章

重要的是委托是不可變的 - 調用Combine / Remove不會改變你調用它的委托 - 所以你不需要克隆任何東西。 對於委托的其他任何操作都是如此:例如,如果獲得調用列表並更改返回數組的內容,則不會更改委托實際執行的操作。

(這就像String的行為,如果你想要另一種思考方式。)

暫無
暫無

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

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