Как цепочки делегатов .NET используются (пере) используются?

StackOverflow https://stackoverflow.com/questions/638038

Вопрос

Скажем, у меня есть следующий код 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 и возвращает его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top