Должно ли цепочка делегатов начинаться с нулевого делегата? - PullRequest
3 голосов
/ 23 апреля 2010

В CLR через C # Джеффри Рихтер приводит следующий пример цепочки делегатов (стр. 406):

internal delegate void Feedback(Int 32 value);

Feedback fb1 = new Feedback(method1);  // in the book, these methods
Feedback fb2 = new Feedback(method2);  // have different names
Feedback fb3 = new Feedback(method3); 

Feedback fbChain = null;
fbChain = (Feedback) Delegate.Combine(fbChain, fb1);
fbChain = (Feedback) Delegate.Combine(fbChain, fb2);
fbChain = (Feedback) Delegate.Combine(fbChain, fb3);

Почему первый вызов Delegate.Combine должен пройти в ноль Delegate? Вот как я мог бы подумать, что это должно быть написано:

Feedback fbChain = (Feedback) Delegate.Combine(fb1, fb2);
fbChain = (Feedback) Delegate.Combine(fbchain, fb3);

Ответы [ 2 ]

7 голосов
/ 23 апреля 2010

Правильно - вам не нужно начинать с нуля. Delegate.Combine возвращает новый делегат со списком вызовов первого аргумента, к которому добавлен список вызовов второго аргумента. Если один из аргументов равен нулю, он просто возвращает другой делегат, который вы передали.

Кроме того, вам не нужно использовать Combine напрямую. Вы можете сделать это:

Feedback fbChain = method1;
fbChain += method2;
fbChain += method3;

или

fbChain = new Feedback(method1) + new Feedback(method2) + new Feedback(method3);

как + для делегатов отображается на Combine. Это также проверяется типом компилятором, вместо того, чтобы использовать Delegate.Combine (который завершится ошибкой только во время выполнения, если сигнатуры не совпадают)

2 голосов
/ 23 апреля 2010

Что ж, согласно определению кажется, что вы можете уменьшить его еще больше:

Feedback fbChain = (Feedback) Delegate.Combine(fb1, fb2, fb3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...