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 需要的任何东西。
我对静态 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 需要的任何东西。