Как цепочки делегатов .NET используются (пере) используются?
Вопрос
Скажем, у меня есть следующий код C #:
Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;
Тесты показывают, что b
не совпадает с экземпляром c
, поэтому очевидно, что оператор +
создает новый экземпляр делегата , Это правильное предположение? Использует ли он внутренний b
-экземпляр или просто копирует информацию о методе / цели в новый экземпляр?
Мне кажется, что я не могу найти реализацию оператора +
для делегатов, кажется, что класс Delegate не содержит его.
Кто-нибудь может пролить свет на эту проблему?
Причина, по которой я спрашиваю, состоит в том, что я создаю некоторые классы, которые будут наслояться друг на друга, как лук, а внешний слой будет вызывать внутренний слой, получать некоторые делегаты, а затем присоединять к ним больше методов. Я просто обеспокоен тем, что это каким-то образом изменит делегатов, которые я получаю из внутреннего уровня, и в этом случае мне нужно возвращать копии / клоны, а не только внутренние ссылки.
Обратите внимание, что это полностью внутренний код для моей библиотеки, поэтому, хотя я знаю, что такая внутренняя структура данных является плохой идеей, если я смогу сделать это безопасно с этими классами, я сделаю это. р>
Решение
Как говорит Кент, + = используется для Delegate.Combine
и - = использует статью о событиях / делегатах для получения дополнительной информации.
Важно то, что делегаты являются неизменными - вызов Combine / Remove не меняет делегата, для которого вы его вызываете, - поэтому вам не нужно ничего клонировать. То же самое верно для всего, что вы делаете с делегатом: если вы получите список вызовов и измените содержимое возвращенного массива, например, это не изменит того, что на самом деле делает делегат.
(Это похоже на поведение String, если вы хотите по-другому об этом думать.)
Другие советы
+ =
эквивалентно Delegate.Combine ()
. - =
эквивалентно Delegate.Remove ()
. Каждый из них создает новый экземпляр Delegate
и возвращает его.