3
public class EventBus<T>
{
    [NotNull] // annotation not valid on this declaration type
    private static event Action<T> Events;

    static EventBus()
    {
        // we always have a do-nothing event handler so we don't have to worry about null checks and race conditions
        Events += T => { };
    }

正如评论中所见,我明确地不想处理到处检查事件的空值。这可以通过在构造时分配一个从不调用的默认无操作事件来解决。Resharper 不能自动解决这个问题也就不足为奇了,所以我想用 NotNull 注释对其进行注释。不幸的是,NotNull 似乎无法应用于事件,但 Resharper 会在我调用事件时毫不犹豫地警告我“可能的‘System.NullReferenceException’”。

如果 resharper 会注意到错误,应该可以通过注释来避免它。

4

1 回答 1

4

如果您想这样做,您可以更改属性(添加标志AttributeTargets.Event)以添加对版本 8 中的事件的支持,它是有效的。

namespace JetBrains.Annotations
{
    /// <summary>
    /// Indicates that the value of the marked element could never be <c>null</c>
    /// </summary>
    /// <example><code>
    /// [NotNull] public object Foo() {
    ///   return null; // Warning: Possible 'null' assignment
    /// }
    /// </code></example>
    [AttributeUsage(
      AttributeTargets.Method | AttributeTargets.Parameter |
      AttributeTargets.Property | AttributeTargets.Delegate |
      AttributeTargets.Field | AttributeTargets.Event, AllowMultiple = false, Inherited = true)]
    public sealed class NotNullAttribute : Attribute { }

我认为他们这样做是因为他们认为对于事件,最好在 raise 之前检查它是否为 null。如果您尝试使用 Resharper 生成事件调用器,它将生成如下内容:

protected virtual void OnMyEvent()
{
    var handler = MyEvent;
    if (handler != null) 
        handler();
}

或者你可以明确地实现你的事件:

[NotNull]
private static Action<T> _eventsInternal = obj => { };

private static event Action<T> Events
{
    add { _eventsInternal += value; }
    remove { _eventsInternal -= value; }
}

protected static void OnEvents(T arg)
{
    _eventsInternal(arg);
}
于 2013-09-21T04:20:03.980 回答