与nullable
类型相关的问题很少:
int x;
Console.WriteLine(x);
如果未初始化变量,则表示它不包含任何内容或
我们可以说它是空的。所以这个空值相当于
null
?
如果是,那么值类型对象如何包含null
值?如果不,
那么这个空值叫什么?
如果我尝试编译未初始化的int
变量(上面提到的代码),那么编译器会返回错误使用未分配的局部变量,但它不会告诉我内部存储的是什么变量
答案 0 :(得分:1)
与字段不同,编译器可以很容易地检测到您使用的是本地非初始化变量,并且不会让您编译该代码,因此它没有任何价值。
对于字段,情况稍有不同,因为编译器不会喊出,而是为该类型分配默认值。如果是int
,则为0
;
答案 1 :(得分:0)
尽管编译器/ JVM(Java虚拟机)确保将所有类的字段初始化为0,0.0,'\ 0'或null(视情况而定),但它无法使用局部变量有效地执行此操作。因此,编译器要求您在任何可能的路径允许读取之前设置变量。
答案 2 :(得分:0)
引用类型存储为对象实例的引用(如指针)。 null 表示不指向对象实例的引用。
值类型作为值本身存储,没有任何引用。拥有空值类型没有意义,因为根据其定义,它包含一个值。
int 是值类型而不是引用类型,这意味着您无法为值类型指定null。
您可以在C#和Java中使值类型为空(尽管语法略有不同)。 Nullable 类型有一个 HasValue 标记,告诉您是否没有值(实际存在,但它是值类型的默认值) )。 用法(C#):
int? NullableInt = null;
Console.WriteLine(NullableInt.Value);
您遇到使用未分配的本地变量错误的原因是默认情况下未初始化本地贵重物品。例如,默认情况下,类成员被初始化。它们没有价值,也不等于null。
根据this answer,Microsoft可能允许未初始化的局部变量。他们只是选择不这样做,因为它本来就是一个bug而不是因为它会阻止你观察当地的垃圾未初始化状态。