Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理可能没有任何订阅服务器的事件_C#_Events - Fatal编程技术网

C# 处理可能没有任何订阅服务器的事件

C# 处理可能没有任何订阅服务器的事件,c#,events,C#,Events,如果类在其方法中触发事件,则该类不必知道订阅其事件的内容或用户。是否有订户也不重要 在下面的代码中,如果OnTigger事件没有任何订户,则会发生异常 public class EventTrigger { public static void Main(string[] args) { (new EventTrigger()).Trigger(); } public delegate void Delegate1(); public e

如果类在其方法中触发事件,则该类不必知道订阅其事件的内容或用户。是否有订户也不重要

在下面的代码中,如果OnTigger事件没有任何订户,则会发生异常

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; };