【问题标题】:Is not initialized integer is equivalent to null未初始化的整数等价于null
【发布时间】:2017-03-19 09:45:02
【问题描述】:

有几个关于nullable类型的问题:

int x;  
Console.WriteLine(x);

如果一个变量没有被初始化,这是否意味着它不包含任何内容或 我们可以说它是空的。那么这个空值是否相当于 null?

如果是,那么值类型对象如何包含null 值?如果不, 那么这个空值叫什么?

如果我尝试编译未初始化的int 变量(上面提到的代码),那么编译器会返回一个错误use of unassigned local variable,但它不会告诉我变量中存储了什么。

【问题讨论】:

  • 它将有默认值,int0
  • @EhsanSajjad:不,逻辑上 local 变量没有值。
  • “它不会告诉我变量内部存储了什么” - 这是因为对于局部变量,编译器会阻止您在明确分配之前使用它,以避免意外使用。
  • @EhsanSajjad:仅适用于字段。
  • 顺便说一句,如果您将其限制为要么 Java C#,那将会很有帮助。规范使用不同的术语来描述这一点。

标签: java c# .net oop


【解决方案1】:

与字段不同,编译器可以轻松检测到您正在使用本地未初始化变量,并且不会让您编译该代码,因此它没有任何价值。

对于字段,情况有点不同,因为编译器不会喊,而是为该类型分配默认值。如果是int,则为0

【讨论】:

    【解决方案2】:

    Java 不允许任何代码读取未初始化的变量。

    尽管编译器/JVM(Java 虚拟机)确保类的所有字段都初始化为 0、0.0、'\0' 或 null(视情况而定),但它不能有效地使用局部变量来执行此操作。因此,编译器要求您在任何可能的路径允许读取之前设置变量。

    【讨论】:

    • 我不认为这是局部变量没有发生这种情况的原因-我相信这更多是为了正确性,避免错误...更多的是编译器无法做到这一点fields 所以它们必须有一个默认值。
    【解决方案3】:

    引用类型存储为对对象实例的引用(如指针)。 null 表示不指向对象实例的引用。

    值类型作为值本身存储,没有任何引用。拥有一个空值类型是没有意义的,因为根据它的定义它包含一个值。

    int 是值类型而不是引用类型,这意味着您不能将 null 分配给值类型。

    您可以在 C# 和 Java 中将值类型设为可为空(尽管语法有所不同)。 Nullable 类型有一个 HasValue 标志,告诉您是否没有值(实际上有,但它是值类型的默认值)。 用法(C#):

    int? NullableInt = null;
    Console.WriteLine(NullableInt.Value);
    

    您遇到use of unassigned local variable错误的原因是默认情况下没有初始化本地值。例如,默认情况下初始化类成员。它们没有值,也不等于 null。

    根据this answer,微软本可以允许未初始化的局部变量。他们只是选择不这样做,因为这将是一个错误,而不是因为它会阻止您观察本地的垃圾未初始化状态。

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多