【问题标题】:C# Delegate events bad practice? [duplicate]C#委托事件不好的做法? [复制]
【发布时间】:2016-09-06 13:23:15
【问题描述】:

我在我的代码中使用了很多自定义事件,并且一直这样声明它们

public delegate void ImageDownloadingEvent(Waypoint waypoint);
public event ImageDownloadingEvent ImageDownloading;

然后像这样解雇他们

if (ImageDownloading != null)
    ImageDownloading(waypoint);

我想知道的是,这是不好的做法吗?还是一种糟糕的做事方式?如果是这样,为什么?还有什么更好的方法?

感谢您的帮助,只是想提高我的编码技能

【问题讨论】:

    标签: c#


    【解决方案1】:

    嗯,由您决定事件是否是用于给定场景的正确模式。像任何东西一样,它们可以正确使用,也可以成为代码异味。如果您不想为每个事件声明一个新类型,您可以使用自己声明的委托,或者使用更通用的委托,例如 FuncEventHandlerAction

    您对事件的使用基本正确。您想将处理程序复制到本地。 Eric Lippert 解释了为什么on his blog

    所以变成了这样:

    var imageDownloading = ImageDownloading;
    if (imageDownloading != null)
        imageDownloading(waypoint);
    

    C# 6 编译器can do this 适合你:

    ImageDownloading?.Invoke(waypoint);
    

    在这种情况下,编译器知道它应该首先制作一个本地副本。

    【讨论】:

    • 只有当要同时从多个线程访问事件时才需要该代码,这很少需要。
    【解决方案2】:

    您可以这样做,尽管在多线程环境中您提升它们的方式可能会出现竞争条件。因此,引发事件的推荐方式实际上是

    var handler = ImageDownloading;
    if (handler != null) handler(waypoint);
    

    在 C# 6 中,使用空条件运算符可以更加简洁:

    ImageDownloading?.Invoke(waypoint);
    

    同样,仅在关注多线程时才相关。无论如何,大多数代码都不是为这种情况而构建的。

    接下来的问题是,您是想为每个事件使用自定义委托,还是为每个事件自定义EventArgs(并将它们声明为EventHandler<T>)。这完全取决于您,但它 .NET 中的一种约定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多