gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:32:31 25 4
gpt4 key购买 nike

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 将注意到错误,应该可以通过注释来避免它。

最佳答案

如果您想这样做,您可以更改属性(添加标志 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);
}

关于c# - 为什么我不能将事件标记为 NotNull?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18928136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com