为什么这会产生一个可为空的数组/如何创建不可为空的数组
Why does this produce a nullable array / How to create non-nullable array
是否可以在 C# 中创建不可为 null 的数组?如果有怎么办?
给定以下代码:
var someArray = new int[10];
这使得 someArray
成为 int[]?
类型,这意味着数组本身可以为空。但是,如何在启用 C# 8.0 可空功能的情况下声明不可空数组?
int[]其实是从Array派生出来的。来自 Microsoft “所有数组实际上都是对象”
所有对象都可以为空(对于所有版本的 C#),因此最近引入的值类型的“可空性”不会影响数组大小写。
现在关于如何防止对象为空的问题。也许你可以通过运行时修改来防止空分配真的很聪明,但是会非常棘手,并且仍然可能有漏洞(一个不安全的分配)
更大问题的支点很可能会揭示更大的数据结构。在该数据结构中,您可以封装数组行为,并依靠自己的编码努力使其保持非空。并且将数组存储为私有变量,您可以放心,没有其他人可以将 null 分配给它。现在当然外部对象可以为 null,但是您可以避免内部代码中的 null 检查。
class Foo {
private int[] someArray = new int[10];
public int[] getArray { return someArray; }
// Insert your amazing stuff here
}
当类型为 int[]?
时,如果您尝试访问它,您将不会收到警告。语言设计团队决定始终将 var
视为可空引用类型,并依靠 DFA(数据流分析)确定何时生成警告。这不是特定于数组的。有关详细讨论,请参阅 dotnet/csharplang#3662。
此外,来自 var
关键字 docs:
When var
is used with nullable reference types enabled, it always implies a nullable reference type even if the expression type isn't nullable.
是否可以在 C# 中创建不可为 null 的数组?如果有怎么办?
给定以下代码:
var someArray = new int[10];
这使得 someArray
成为 int[]?
类型,这意味着数组本身可以为空。但是,如何在启用 C# 8.0 可空功能的情况下声明不可空数组?
int[]其实是从Array派生出来的。来自 Microsoft “所有数组实际上都是对象”
所有对象都可以为空(对于所有版本的 C#),因此最近引入的值类型的“可空性”不会影响数组大小写。
现在关于如何防止对象为空的问题。也许你可以通过运行时修改来防止空分配真的很聪明,但是会非常棘手,并且仍然可能有漏洞(一个不安全的分配)
更大问题的支点很可能会揭示更大的数据结构。在该数据结构中,您可以封装数组行为,并依靠自己的编码努力使其保持非空。并且将数组存储为私有变量,您可以放心,没有其他人可以将 null 分配给它。现在当然外部对象可以为 null,但是您可以避免内部代码中的 null 检查。
class Foo {
private int[] someArray = new int[10];
public int[] getArray { return someArray; }
// Insert your amazing stuff here
}
当类型为 int[]?
时,如果您尝试访问它,您将不会收到警告。语言设计团队决定始终将 var
视为可空引用类型,并依靠 DFA(数据流分析)确定何时生成警告。这不是特定于数组的。有关详细讨论,请参阅 dotnet/csharplang#3662。
此外,来自 var
关键字 docs:
When
var
is used with nullable reference types enabled, it always implies a nullable reference type even if the expression type isn't nullable.