事件处理程序订阅混乱
Events Handlers Subscription confusion
我很少需要使用事件,因为有大量不同的有效语法,有时当我重新访问它们时会感到困惑。
我想知道这两个调用之间的根本区别是什么?
public class Foo
{
public event EventHandler<int> OnBar;
}
var foo = new Foo();
EventHandler<TDTO> handler1 = (object obj, int args) => { /*do work*/ }
EventHandler<TDTO> handler2 = (object obj, int args) => { /*do more work*/ }
foo.OnBar += handler1;
foo.OnBar += handler2;
或者这样调用
var foo = new Foo();
EventHandler<TDTO> handler1 = (object obj, int args) => { /*do work*/ }
handler1 += (object obj, int args) => { /*do more work*/ }
foo.OnBar += handler1;
您是唯一将参考文献分开以便可以单独取消订阅的吗?
或者使用一个比另一个有附加价值。
这两种订阅方式没有实际区别。常规事件(即 - 不提供自定义 add
和 remove
的事件)只是委托的包装器,与问题中的 handler1
(例如)相同的委托。所以你在比较这个:
Action @event= null;
Action a = () => Console.WriteLine("A");
Action b = () => Console.WriteLine("B");
@event += a;
@event += b;
有了这个:
Action @event = null;
Action a = () => Console.WriteLine("A");
Action b = () => Console.WriteLine("B");
a += b;
@event += a;
@event();
并且没有区别:在这两种情况下,委托 @event
的调用列表都包含委托 a
和 b
。即使您从未调用过 @event += b
.
,您甚至可以从调用列表中删除 b
也就是说,将具有多个处理程序的委托传递给事件是非常不寻常的。此外,如果事件确实为 add
和 remove
提供自定义实现 - 它可能不会期望这样的委托。例如,如果您调用 foo.OnBar += ...
两次 - 自定义 add
将被调用 2 次。但是如果你传递已经组合的委托,你只调用它一次,所以 add
也会被调用一次。所以我建议不要这样做,始终将单个委托传递给事件,而不是预先组合它们。
我很少需要使用事件,因为有大量不同的有效语法,有时当我重新访问它们时会感到困惑。
我想知道这两个调用之间的根本区别是什么?
public class Foo
{
public event EventHandler<int> OnBar;
}
var foo = new Foo();
EventHandler<TDTO> handler1 = (object obj, int args) => { /*do work*/ }
EventHandler<TDTO> handler2 = (object obj, int args) => { /*do more work*/ }
foo.OnBar += handler1;
foo.OnBar += handler2;
或者这样调用
var foo = new Foo();
EventHandler<TDTO> handler1 = (object obj, int args) => { /*do work*/ }
handler1 += (object obj, int args) => { /*do more work*/ }
foo.OnBar += handler1;
您是唯一将参考文献分开以便可以单独取消订阅的吗?
或者使用一个比另一个有附加价值。
这两种订阅方式没有实际区别。常规事件(即 - 不提供自定义 add
和 remove
的事件)只是委托的包装器,与问题中的 handler1
(例如)相同的委托。所以你在比较这个:
Action @event= null;
Action a = () => Console.WriteLine("A");
Action b = () => Console.WriteLine("B");
@event += a;
@event += b;
有了这个:
Action @event = null;
Action a = () => Console.WriteLine("A");
Action b = () => Console.WriteLine("B");
a += b;
@event += a;
@event();
并且没有区别:在这两种情况下,委托 @event
的调用列表都包含委托 a
和 b
。即使您从未调用过 @event += b
.
b
也就是说,将具有多个处理程序的委托传递给事件是非常不寻常的。此外,如果事件确实为 add
和 remove
提供自定义实现 - 它可能不会期望这样的委托。例如,如果您调用 foo.OnBar += ...
两次 - 自定义 add
将被调用 2 次。但是如果你传递已经组合的委托,你只调用它一次,所以 add
也会被调用一次。所以我建议不要这样做,始终将单个委托传递给事件,而不是预先组合它们。