C#8引入了对null引用类型的静态检查,我正试图将它们引入现有代码的某些(小(部分。
我正在解决的一个问题是我在代码中经常使用的构造函数模式。考虑以下(过于简单化(示例:
#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})";
}
#nullable disable
private
构造函数用于处理无论发生什么情况都必须运行的公共初始化代码。它由两个public
构造函数调用,以避免在其中复制粘贴代码。(是的,如果通用初始化代码归结为一个属性,那么可以说将其移动到一个单独的构造函数是没有意义的——但是,正如我所说,这是一个过于简单化的例子(。
尽管如此,由于private
构造函数不会初始化OtherProperty
,因此此代码(当然(会产生关于未初始化的不可为null的类型的警告。
在这种情况下,使用静态null
检查和不复制/粘贴代码之间是否有其他选择?如果没有,如何在将通用初始化代码移动到单个位置时使用静态null
检查?
将常用初始化代码移动到基类中怎么样?
通过这种方式,编译器可以确保在OtherProperty
未被分配值且公共初始化代码位于单个位置的情况下,您永远不会实例化SomeClass
。
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})";
}