为什么我不能将事件标记为NotNull?

时间:2013-09-21 01:56:57

标签: c# visual-studio-2012 resharper

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

正如评论中所见,我明确地不想在任何地方处理null检查事件。这是通过在从未调用的构造中分配默认的do-nothing事件来解决的。 Resharper不能自动解决这个问题并不奇怪,所以我想用NotNull注释来注释它。不幸的是,似乎NotNull不能应用于事件,但Resharper在我调用我的事件时随时警告我“可能的'System.NullReferenceException'”。

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

1 个答案:

答案 0 :(得分: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 { }

我认为他们这样做是因为他们认为对于事件,最好在加注之前将其检查为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);
}