Читая документацию, я вижу, что оператор +
можно использовать для составления/объединения делегатов одного типа.
Точно так же я вижу, что могу удалить a из составленного делегата, используя оператор -
.
Я также заметил, что тип Action
имеет статические методы Combine
и Remove
, которые можно использовать для объединения списков вызовов двух делегатов и для удаления последнего экземпляра списка вызовов делегата из списка вызовов другого делегата соответственно.
Action a = () => Debug.WriteLine("Invoke a");
Action b = () => Debug.WriteLine("Invoke b");
a += b;
a.Invoke();
//Invoke a
//Invoke b
Action c = () => Debug.WriteLine("Invoke c");
Action d = () => Debug.WriteLine("Invoke d");
Action e = Action.Combine(c, d);
e.Invoke();
//Invoke c
//Invoke d
a -= b;
a.Invoke();
//Invoke a
e = Action.Remove(e, d);
e.Invoke();
//Invoke c
Похоже, они дают одинаковые результаты с точки зрения того, как они объединяются/удаляются из списка вызовов.
Я видел оба способа, используемые в различных примерах на SO и в другом коде. Есть ли причина, по которой я должен использовать тот или иной способ? Есть ли пит-фоллы? Например, я вижу предупреждение в строке a -= b;
о том, что Delegate subtraction has unpredictable results
— следует ли мне избегать этого с помощью команды «Удалить»?
Obviously the static methods return a new delegate whilst the accessors don't
Неправильно - person SLaks   schedule 07.01.2013a += b
не возвращает новыйDelegate
, в то время какDelegate.Combine(a, b)
явно возвращает. - person Fraser   schedule 07.01.2013a += b
— это сокращение отa = a + b
(как и любое другое добавление+=
), которое явно возвращает нового делегата. (Обратите внимание, что события совершенно разные) - person SLaks   schedule 08.01.2013