我想知道如何使用后期初始化C# 中的类字段可为空的引用类型。
想象一下下面的类:
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
to PdfDoc?
,但是我必须使用?.
or !.
到处都在使用它,这很令人讨厌。
我也可以通过doc
作为每个方法的参数,但请记住,我有一些这样的字段,这违反了我眼中的干净代码原则。
我正在寻找一种方法来告诉编译器我将初始化doc
在使用它之前(实际上我这样做了,调用者不可能得到空引用异常!)。我认为 Kotlin 有lateinit修饰符正是为了这个目的。
您将如何用“干净”的 C# 代码解决这个问题?
到目前为止我发现的最好的解决方案是这个:
private PdfDoc doc = null!;
这通过使用删除所有编译器警告空值宽容运算符C# 8 中引入。它允许您使用一个值,就好像它不为空一样。因此,它的一种使用方式是当您需要类似于 Kotlin 的“lateinit”。与Kotlin的lateinit不同,这里它实际上会被初始化为null,这是编译器和运行时都允许的。如果你以后在不需要null的地方使用这个变量,你会得到一个NullReferenceException,并且编译器不会警告你认为它可能为空,因为它会认为它不为空。Kotlin 的 Lateinit 有一个微妙的区别,如果你在初始化之前访问了一个 Lateinit 属性,它会抛出一个特殊的异常,清楚地标识正在访问的属性以及以下事实:它尚未初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)