【发布时间】:2020-03-23 15:51:00
【问题描述】:
我对静态类中的 C# 8 可空引用类型有疑问。这是我的原始代码。
public static class Foo
{
private static IFactory _factory;
public static void Init(IFactory factory) => _factory = factory;
public static string GetVersion() => _factory.GetVersion();
}
现在我有一个警告
私有静态 IFactory _factory; //非空字段未初始化。考虑将该字段声明为可为空。
这是正确的,因为不调用Init(),_factory 将是null。但我会在程序一开始就打电话给Init()。
所以我将其设为可空 private static IResultFactory? _factory; 并且警告消失了。
但我又收到了一个警告
公共静态字符串 GetVersion() => _factory.GetVersion(); //取消引用可能为空的引用。
在这里我知道,当我到达这里时,它不会是null,除了! (null-forgiving) operator之外还有其他优雅的方式吗?
或者我还缺少什么来解决这个问题?
更新:我知道一个方法有一些技巧和窍门,例如:
internal static T NotNull<T>([NotNull] this T? value) where T : class =>
value ?? throw new ArgumentNullException(nameof(value));
这里是说返回不会是null,只是为了摆脱警告。
我想知道有没有类似的东西。
【问题讨论】:
-
我的第一个想法是使用空对象模式或静态构造函数。另外我必须说这有点像服务定位器,我不喜欢这样使用静态类。
-
@LeisenChang 你能解释一下什么是空对象模式吗?
-
为什么不接受第二个警告呢?您说您将始终在程序开始时调用 Init ......这意味着如果您不这样做,将会抛出异常,这可能是您想要的。异常告诉您某些内容不正确,因此无法继续执行。
-
你的初始化不是线程安全的,所以它已经有问题了。正如已经建议的那样,您应该使用静态构造函数,或者
System.Lazy<IFactory>
标签: c# .net .net-core c#-8.0 nullable-reference-types