分配动作<;T>;方法并订阅Action<;T>;事件
本文关键字:gt lt Action 事件 分配 方法 | 更新日期: 2023-09-27 18:24:23
假设我有下面的代码。直接分配操作和订阅事件有什么区别?
//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
}
}
(顺便说一句,当你使用了两次相同的类型名称时,很难解释。)
当您使用公共字段时,客户端不仅可以订阅事件,还可以通过分配而不是添加来完全删除其他事件处理程序
myClass.OnAdd = Add;
他们还可以直接调用处理程序:
myClass.OnAdd("foo");
这两者都违反了正常的pub/sub模式,即不同的订阅者彼此隔离。订阅服务器无法覆盖彼此的订阅(只能添加或删除自己的订阅),也无法自行引发事件。
有关活动和代表的更多信息,请参阅我关于该主题的文章。
您可以为一个事件分配多个委托(因此是+=
运算符)。
正如John所指出的,事件就像代理的包装器,提供保护以防止重新分配/删除。我觉得这本书读起来很不错。