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会注意到错误,应该可以通过注释来避免它。
答案 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);
}