我想知道如何在使用可空引用类型的C#中使用late-initialized类字段。 想象一下以下类:
public class PdfCreator {
private PdfDoc doc;
public void Create(FileInfo outputFile) {
doc = new PdfWriter(outputFile);
Start();
}
public void Create(MemoryStream stream) {
doc = new PdfWriter(stream);
Start();
}
private void Start() {
Method1();
// ...
MethodN();
}
private void Method1() {
// Work with doc
}
// ...
private void MethodN() {
// Work with doc
}
}
上面的代码非常简化。我的实际类使用了更多像
doc
这样的字段,并且还有一些带有一些参数的构造函数。使用上述代码,我在构造函数上得到了编译器警告,提示
doc
未初始化,这是正确的。我可以通过将doc
的类型设置为PdfDoc?
来解决这个问题,但是那样我就必须在使用它的地方使用?.
或!.
,这很麻烦。我也可以将
doc
作为参数传递给每个方法,但请记住我有一些像这样的字段,这违反了我的“clean code”原则。我正在寻找一种方法,告诉编译器,在使用它之前我将初始化
doc
(实际上我已经这样做了,调用者不可能得到空引用异常!)。我认为Kotlin正是出于这个目的而有lateinit
修饰符。你会如何用“clean” C#代码解决这个问题?
private PdfDoc doc = null;
- vasily.sibnullable reference type
假装成non-nullable reference type
一样“hacky”。 - vasily.sibpdfDoc
变量之前读取它。我并没有违反非空规则,编译器似乎只是无法证明这一点(但还没有)。 - AndiMethod1
中进行了空值检查(可空引用类型),或者在构造函数中初始化了doc
(非空引用类型)。 - vasily.sib