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

时间:2009-09-14 19:28:13

标签: c# initialization default int default-value

这有效:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

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

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

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

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

整数默认为0吗?这是编译器对“最佳实践”强制执行的操作。或者还有其他原因吗?

5 个答案:

答案 0 :(得分:34)

在第一个示例中,它是字段。 Fields自动默认为0 / false / null。在第二个示例中,它是变量。变量默认,并且在使用之前必须具有“明确赋值”。

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

答案 1 :(得分:11)

  

不要将整数默认为0吗?

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

答案 2 :(得分:2)

当你实例化一个类的新实例时,对象需要的所有内存都是“归零”的整数被设置为0字符串被设置为null等。这是为了避免很多奇怪的内存错误和黑客可能用C(++)。不幸的是,这也有一个很小的处理成本,所以当你创建一个局部变量时,语言假定你将很快自己设置值,并且不会将它归零以减少所需指令的总数。为了抵消使用未设置内存的风险,这会引入编译器检查以确保在允许您使用变量之前设置了值。

答案 3 :(得分:2)

这可能是因为在类级别声明的变量不能在同一范围内赋值(除了声明时)

e.g

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

,而

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

答案 4 :(得分:-1)

据我所知,当我们在类中声明一个变量并创建一个对象时,默认构造函数会初始化变量,因此不需要初始化类变量。但是来到类中的方法没有构造函数或任何东西来初始化这些变量,所以我们不能在方法中分配未初始化的变量。