C# 处理可能没有任何订阅服务器的事件
如果类在其方法中触发事件,则该类不必知道订阅其事件的内容或用户。是否有订户也不重要 在下面的代码中,如果OnTigger事件没有任何订户,则会发生异常C# 处理可能没有任何订阅服务器的事件,c#,events,C#,Events,如果类在其方法中触发事件,则该类不必知道订阅其事件的内容或用户。是否有订户也不重要 在下面的代码中,如果OnTigger事件没有任何订户,则会发生异常 public class EventTrigger { public static void Main(string[] args) { (new EventTrigger()).Trigger(); } public delegate void Delegate1(); public e
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();
}
但对我来说这似乎很奇怪,因为触发者不必知道订阅
我的问题是:
每当我使用事件引用时,是否必须检查它是否为空。如果您初始化
OnTrigger
,则不必进行检查。
e、 g
Yes'delegate{}实例化一个新对象,这就是为什么它允许您省略'null'检查 ''delegate{}'不返回任何内容,因此如果希望它返回字符串(如果Delegate1返回字符串,则需要该字符串),则只需添加'return';例如:
public event Action OnTrigger = delegate { return string.Empty; };
我要补充的一点是,这样做是为了避免空检查,这是一种不好的做法,因为这是一种懒惰的黑客行为。某些代码仍然可以将事件设置为null,'OnTrigger=null'将破坏您的代码。当涉及到(反)序列化时,它根本不起作用。触发器不必知道单个订阅者的情况,但它需要知道订阅者的情况。你要么每次都做空检查,要么使用Simon建议的工作。这里有一个关于这个主题的有趣讨论:我在宇宙中并不孤单。这让我感觉很好。但我认为这也不是一个好办法。不是因为它是通过扩展方法完成的。因为它还需要更多的键盘输入,而且更脏。谢谢。我有两个问题:第一。“委托{};”是否初始化对象?它的回报是什么?第二。如何处理返回值的委托?如下所示:公共委托字符串Delegate1();公共事件被委派者1 OnTigger=委派{};初始化事件以包含空订阅服务器有点令人讨厌,因为与处理其他场景相比,
委托.Combine
和委托.Remove
将委托添加为零或从自身中减去委托要快得多,与组合委托相比,Delegate.Invoke
处理非组合委托的开销更小(跳过空委托的调用比调用伪委托更快)。如果预期的订户数大于1,则添加空委托可能不太糟糕,但如果最多预期一个订户,则是浪费。
public event Action OnTrigger = delegate { return string.Empty; };