【问题标题】:C# Compiler - Unassigned Field and Local Variable Initial ValueC# 编译器 - 未分配的字段和局部变量初始值
【发布时间】:2018-02-18 23:48:16
【问题描述】:

出于好奇:

此代码有效并执行:

public class Program
{
    private static DateTime date;

    public static void Main()
    {
        Console.WriteLine(date.ToString("o"));
    }
}

看到它在.NET Fiddle上工作

但这甚至不能编译(未分配的局部变量):

public class Program
{
    public static void Main()
    {
        DateTime date;
        Console.WriteLine(date.ToString("o"));
    }
}

看到它(不是)在.NET Fiddle上工作

DateTime 是一种不可为空的值类型,因此它不需要被分配和初始化以具有值,它有一个默认值。

那么为什么编译器允许 DateTime 字段版本编译而不让局部变量版本编译?当代码编译成 IL 时,是什么阻止了值类型局部变量的使用?

【问题讨论】:

标签: c# .net datetime compiler-errors compilation


【解决方案1】:

没有显式初始化的字段会自动初始化为默认值。

这很有用,因为它是一个非常常见的初始值,因此可以节省时间。

没有初始化的本地处于无法使用的状态。

这很有用,因为您很可能做错了什么(尤其是在有多个确定初始值的路径时),因此将其设置为默认值可能会隐藏错误。

【讨论】:

    【解决方案2】:

    局部变量不会自动初始化,因此没有默认值。出于明确分配检查的目的,局部变量最初被认为是未分配的。 local-variable-declaration 可以包含 local-variable-initializer,在这种情况下,该变量被视为在其整个范围内明确分配,除了 local-variable-initializer 中提供的表达式。

    在局部变量的范围内,在其 local-variable-declarator 之前的文本位置引用该局部变量是编译时错误。

    来源:-https://msdn.microsoft.com/en-us/library/aa691170(v=vs.71).aspx

    【讨论】:

      【解决方案3】:

      DateTime 是一个不可为空的值类型,所以它不需要被赋值和初始化,它有一个默认值

      不完全是。

      来自docs

      与类不同,结构可以在不使用new 运算符的情况下进行实例化。在这种情况下,没有构造函数调用,这使得分配更有效率。 但是,这些字段将保持未分配状态,并且在所有字段都初始化之前无法使用该对象

      查看其他答案以了解“为什么编译器允许 DateTime 字段版本编译而不允许局部变量版本编译?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多