为什么C#局部变量应该直接赋值,即使它是默认值?

Ant*_*nio 9 c# compiler-construction initialization local-variables default-value

如果你看下一个例子:

public void TestLocalValuesAssignment()
{
    int valueVariable; // = default(int) suits fine
    string refType; // null suits fine as well

    try
    {
        valueVariable = 5;
        refType = "test";
    }
    catch (Exception){}

    Console.WriteLine("int value is {0}", valueVariable);
    Console.WriteLine("String is {0}", refType);
}
Run Code Online (Sandbox Code Playgroud)

你可以很容易地看到,变量valueVariablerefType可能是他们在使用前未分配Console.WriteLine().编译器告诉我们有错误:

Error   1   Use of unassigned local variable 'valueVariable'
Error   2   Use of unassigned local variable 'refType'  
Run Code Online (Sandbox Code Playgroud)

这是一个普遍的案例,并且有很多关于如何解决这个问题的答案(可能的修补程序已经评论过).

我无法理解的是为什么存在这种行为?这里的局部变量与类字段的不同之处在于,如果没有赋值,最后的变量会得到默认值(引用类型为null,值类型的对应默认值为空)?也许有一个例子或一个角落案例解释了为什么选择这样的编译器行为?

Mzf*_*Mzf 12

基本上 - 这就是MS决定的.

如果你想要更多,你可以在这里阅读并查看Eric Lippert的博客

这在C#中是非法的原因是因为使用未分配的本地很可能是一个bug.

  • @Antonio:对.基本上,这个想法是(1)未初始化的变量可能是错误,并且(2)当局部未明确分配时很容易检测到,但是当一个字段未明确分配时,检测起来要困难得多.因此,规则是:必须明确分配本地人.如果它很便宜并且很容易找到未分配的字段,那么规则也会扩展到字段,但它并不便宜且容易. (2认同)

Mar*_*zek 5

C# 规范中对此进行了描述:

\n\n
\n

5.1.7 局部变量

\n\n

由局部变量声明引入的局部变量不会自动初始化,因此没有默认值。出于明确赋值检查的目的,由局部变量声明引入的局部变量最初被视为未赋值。\n 局部变量声明可以包含局部变量初始化程序,在这种情况下,仅在初始化表达式 (\xc2\xa75.3.3.4) 之后才将变量视为明确分配。

\n\n

在local-variable-declaration引入的局部变量的范围内 ,在其local-variable-declarator之前的文本位置引用该局部变量会产生编译时错误 。如果局部变量声明是隐式的 (\xc2\xa78.5.1),则在其local-variable-declarator中引用该变量也是错误的。

\n
\n