关于默认构造函数的困惑

时间:2013-02-16 15:58:39

标签: c# default-constructor

using System;
class Test
{
    string name;
    int num1, num2;

    public Test()
    {
        num1=10;
        num2=20;
    }

    public void Show()
    {
        Console.WriteLine(num1+num2);
        Console.WriteLine(name);
    }

}

class TestDemo
{
    static void Main()
    {
        Test ob = new Test();
        ob.Show();
    }
}

混乱:

完整参考C#3.0表示如果定义自己的构造函数,则不会调用默认构造函数。我做了那件事,但是保留了字符串变量而没有使用我定义的构造函数初始化它。现在根据上面的概念,字符串变量没有被初始化,并且没有默认构造函数会运行以给它一个默认值,因为我已经定义了自己的。

因此,为什么它没有显示错误,该字符串未使用任何值或类似的东西进行初始化。它是否表明它已从某处[编译器的默认构造函数]分配了值?

2 个答案:

答案 0 :(得分:3)

没有“未初始化”字段(无论是静态还是实例)。 所有字段都使用默认值初始化(引用类型为null,值类型为“自然零”)。

如果你包含一个readonly字段而没有在构造函数中赋值,编译器会给你一个警告,因为它总是具有那个默认值 - 但它是还是初恋。

编译器只能在没有明确分配的情况下发现使用 local 变量的时间。这是因为编译器在方法中有更多关于控制流的信息,而不是类中方法之间的。如果你有一个方法为一个字段分配一个值而另一个方法从字段中获取值,那么编译器就无法知道哪个将被首先调用 - 而明确赋值的规则允许它分析一个方法来发现 potential 会在没有首先赋值的情况下读取变量。

顺便说一句,这些都与默认构造函数无关。如果你根本不提供任何构造函数,编译器只有提供一个默认构造函数 - 所以在Test类中,没有默认构造函数,因为你已经提供了自己的无参数构造函数。即使编译器 提供了默认构造函数,它也完全等同于:

public Test() {}

......字段仍然只有默认值。

答案 1 :(得分:-1)

你的构造函数

  public Test()
  {
      num1=10;
      num2=20;
  }

相同
 public Test()
 {     
 }

如果您要初始化num1num2,可以执行以下操作:

private int num1, num2; //public fields are not recommended

public Test(int numberOne, int numberTwo)
{
    num1 = numberOne;
    num2 = numberTwo;
}

你可以按如下方式进行初始化:

Test ob = new Test(10,20);