C# 8 introduced static checks for nulls in reference types,我正在尝试将它们介绍到现有代码的某些(小)部分。
我解决的一个问题是在代码中使用了大量构造函数的模式……考虑这个(过于简化的)示例:
#nullable enable
public class SomeClass
{
public string SomeProperty {get; private set;}
public string OtherProperty {get; private set;}
private SomeClass(string prop1)
{
SomeProperty = prop1;
}
public SomeClass(string prop1, string prop2) : this(prop1)
{
OtherProperty = prop2;
}
public SomeClass(string prop1, int prop2) : this(prop1)
{
OtherProperty = prop2.ToString();
}
public override string ToString() =>
$"({SomeProperty}, {OtherProperty})";
}
私有构造函数在那里处理无论如何都必须运行的通用初始化代码。这是由两个公共构造函数调用的,以避免必须在其中复制粘贴代码。 (是的,如果常见的初始化代码归结为单个属性,那么将其移至单独的构造函数可能就没有意义;但是正如我所说的,这是一个过于简化的示例)。
仍然,此代码(当然)会生成有关未初始化的不可为空的类型的警告,因为私有构造函数不会初始化OtherProperty
。
因此,在这种情况下,是否有使用静态null检查和不复制粘贴代码之间的替代方法?如果没有,如何在将通用初始化代码同时移动到单个位置的同时使用静态空值检查?
将常见的初始化代码移入基类怎么办?
这样,编译器可以确保在没有为SomeClass
赋值的情况下,您永远不会实例化OtherProperty
。并且]您的常用初始化代码位于单个位置。
public class SomeBaseClass
{
protected SomeBaseClass(string prop1)
{
SomeProperty = prop1;
}
public string SomeProperty { get; private set; }
}
public class SomeClass : SomeBaseClass
{
public SomeClass(string prop1, string prop2) : base(prop1)
{
OtherProperty = prop2;
}
public SomeClass(string prop1, int prop2) : base(prop1)
{
OtherProperty = prop2.ToString();
}
public string OtherProperty { get; private set; }
public override string ToString() =>
$"({SomeProperty}, {OtherProperty})";
}