如果类在其方法中触发事件,则该类不必知道订阅其事件的内容或者谁。如果有任何订户,这也不重要。
在下面的代码中,如果OnTrigger事件没有订阅者,则会发生异常。
public class EventTrigger
{
public static void Main(string[] args)
{
(new EventTrigger()).Trigger();
}
public delegate void Delegate1();
public event Delegate1 OnTrigger;
void Trigger()
{
OnTrigger();
}
}
我可以像这样召唤这个事件;
if (OnTrigger != null)
{
OnTrigger();
}
但这对我来说似乎很奇怪,因为触发器不必了解订阅。
我的问题是:
每当我使用它时,是否必须检查事件引用是否为空。
答案 0 :(得分:2)
如果您初始化OnTrigger
,那么您不必进行检查。
e.g。
public event Action OnTrigger = delegate { };
是'delegate {}'实例化一个新对象,这就是为什么这允许你省略'空'检查。
'delegate {}'什么都不返回,所以如果你想要它返回一个字符串(如果Delegate1返回一个字符串你需要它),那么你只需要添加'return“”;'例如:
public event Action OnTrigger = delegate { return string.Empty; };
我应该补充的是,为了避免空检查,这样做是不好的做法,因为这是一个懒惰的黑客攻击。有些代码仍然可以将事件设置为null,'OnTrigger = null'会破坏您的代码。当涉及到(de)序列化时,它根本不起作用。
答案 1 :(得分:1)
触发器不必了解各个订户,但确实需要了解订阅。您必须每次都进行空检查或使用Simon建议的解决方法。