假设我有以下代码。直接分配动作和订阅事件有什么区别?
//Action directly assigned
public class ClassA
{
public Action<string> OnAdd;
private void SomethingHappened()
{
OnAdd("It Happened");
}
}
public class ClassB
{
public ClassB()
{
var myClass = new ClassA();
myClass.OnAdd = Add;
}
private void Add(string Input)
{
//do something
}
}
//Event handlers
public class ClassA
{
public event Action<string> OnAdd;
private void SomethingHappened()
{
if (OnAdd != null)
OnAdd("It Happened"); //Should it be OnAdd.Invoke("It Happened") ???????
}
}
public class ClassB
{
public ClassB()
{
var myClass = new ClassA();
myClass.OnAdd += Add;
}
private void Add(string Input)
{
//do something
}
}
答案 0 :(得分:10)
(顺便说一句,当你两次使用相同的类型名称时很难解释。)
当您使用公共字段时,客户端不仅可以订阅事件 - 他们还可以通过分配而不是添加来完全删除其他事件处理程序:
myClass.OnAdd = Add;
他们也可以直接调用处理程序:
myClass.OnAdd("foo");
这两个都违反了正常的发布/订阅模式,其中各个订阅者彼此隔离。订阅者不会覆盖彼此的订阅(只添加或删除他们自己的订阅),他们不会自己提出活动。
有关活动和代表的更多信息,请参阅my article on the topic。
答案 1 :(得分:2)
您可以为一个事件分配多个代理(因此+=
运算符)。
答案 2 :(得分:0)
一个事件就像一个委托的包装器,提供保护,以防止重新分配/删除,正如约翰所指出的那样。我发现this非常好读。