c# 静态中的 8 个可为 null 的引用类型 class

c# 8 nullable reference types in static class

我对静态 class 中的 C# 8 可空引用类型有疑问。这是我的原始代码。

    public static class Foo
    {
        private static IFactory _factory;

        public static void Init(IFactory factory) => _factory = factory;

        public static string GetVersion() => _factory.GetVersion();
    }

现在我有一个警告

private static IFactory _factory; //Non-nullable field is uninitialized. Consider declaring the field as nullable.

这是正确的,因为如果不调用 Init()_factory 将是 null。但是我会在程序的最开始调用 Init()

所以我将其设置为可为空 private static IResultFactory? _factory; 并且警告消失了。 但是我又收到一个警告

public static string GetVersion() => _factory.GetVersion(); //Dereference of a possibly null reference.

这里我知道当我到达这里时它不会是 null,除了 ! (null-forgiving) operator?

之外的任何优雅方式

或者我还缺少其他什么来解决这个问题?

更新:我知道有一些提示和技巧的方法,例如:

internal static T NotNull<T>([NotNull] this T? value) where T : class =>
            value ?? throw new ArgumentNullException(nameof(value));

这里说 return 不会是 null,只是为了去掉警告。 我想知道是否有类似的东西。

首先我认为可以使用空对象模式:

public static class Foo
{
    private static IFactory _factory = new NullFactory();

    public static void Init( IFactory factory ) => _factory = factory;

    public static string GetVersion() => _factory.GetVersion();
}

public interface IFactory
{
    string GetVersion();
}

public class NullFactory : IFactory
{
    public string GetVersion()
    {
        return string.Empty;
    }
}

如果IFactory不一定是从外部传入的,也可以考虑静态构造函数

public static class Foo
{
    private static IFactory _factory;

    static Foo()
    {
        _factory = new Factory();
    }

    public static string GetVersion() => _factory.GetVersion();
}

但毕竟我不喜欢用static class 除了扩展方法。我建议将 IFactory 分配给 class 需要的任何东西。