gpt4 book ai didi

C# 不可空字段 : Lateinit?

转载 作者:行者123 更新时间:2023-12-04 02:37:49 32 4
gpt4 key购买 nike

我想知道如何在 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
}
}

上面的代码非常简化。我的真实类(class)使用了更多的字段,比如 doc 并且还有一些带有一些参数的构造函数。

使用上面的代码,我在构造函数上收到编译器警告, doc 未初始化,这是正确的。我可以通过将 doc 的类型设置为 PdfDoc? 来解决这个问题,但是我必须在任何使用它的地方都使用 ?.!. ,这很糟糕。

我也可以将 doc 作为参数传递给每个方法,但请记住,我有一些这样的字段,这违反了我眼中的干净代码原则。

我正在寻找一种方法来告诉编译器,我将在使用之前初始化 doc(实际上我这样做了,调用者不可能获得空引用异常!)。我认为 Kotlin 具有 lateinit 修饰符正是为此目的。

您将如何在“干净”的 C# 代码中解决这个问题?

最佳答案

到目前为止,我找到的最佳解决方案是:

private PdfDoc doc = null!;

这通过使用 C# 8 中引入的 null-forgiving operator 删除了所有编译器警告。它允许您使用一个值,就好像它不为空一样。因此,当您需要类似于 Kotlin 的“ lateinit”的东西时,可以使用它的一种方式。与 Kotlin 的 lateinit 不同,它实际上会在此处初始化为 null,这将被编译器和运行时所允许。如果您稍后在不期望为 null 的地方使用此变量,您会得到 NullReferenceException,并且编译器不会警告您它可能为 null,因为它会认为它不为 null。 Kotlin 的 lateinit 有一个微妙的区别,如果你在初始化之前访问了一个 lateinit 属性,它会抛出一个特殊的异常,清楚地标识正在访问的属性以及它尚未初始化的事实。

关于C# 不可空字段 : Lateinit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60812587/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com