为什么我必须在默认为0时为C#中的int赋值?

Joh*_*ski 24 c# int default initialization default-value

这有效:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会产生编译错误("使用未分配的局部变量'a'"):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是因为在第一个例子中,从技术上讲,编译器不知道没有分配'a'.在后一个例子中,'a'是在本地定义的,因此很容易跟踪.

但为什么后一个例子不起作用?

不要将整数默认为0吗?这是编译器对"最佳实践"强制执行的操作.还是有其他原因吗?

Mar*_*ell 34

在第一个例子中,它是一个字段.Fields自动默认为0/false/null.在第二个例子中,它是一个变量.变量不是默认值,在使用之前必须具有"明确赋值".

本质上,在创建对象(或初始化结构)时,它会将内存归零(或者在非默认结构的情况下,强制您手动初始化所​​有内容).但是,变量是如此常见(在每种方法中),它不希望总是必须将堆栈归零.它会强制您指示初始值.

  • 这也使编译器能够优化本地的重用.例如:"for(...){int j; ...} for(...){int k; ...}" - 当k出现时,编译器可以重复使用为j分配的空间,因为他们从不重叠.如果k必须在使用之前进行初始化,那么我们永远不必担心将j的前值留在那里. (4认同)

Chr*_*isW 11

不要将整数默认为0吗?

当它们是类的数据成员时它们会这样做,但是当它们是局部变量时它们不会这样做:局部变量需要在使用之前显式初始化,因此编译器错误.

  • http://msdn.microsoft.com/en-us/library/aa691170%28VS.71%29.aspx:"局部变量不会自动初始化,因此没有默认值.为了明确赋值检查,局部变量最初被认为是未分配的." (4认同)