关于默认构造函数的困惑

本文关键字:构造函数 默认 于默认 | 更新日期: 2023-09-27 17:59:36

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指出,如果您定义自己的构造函数,则不会调用默认构造函数。我做了那件事,但没有用我定义的构造函数初始化字符串变量。现在,根据上面的概念,字符串变量没有初始化,也不会运行默认构造函数来给它一个默认值,因为我已经定义了自己的值。

所以,为什么它没有显示错误,这个字符串没有用任何值或类似的东西初始化。这难道不表明它被从某个地方分配了一个值[编译器的默认构造函数]吗?

关于默认构造函数的困惑

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

如果在构造函数中包含一个未赋值的readonly字段,编译器将向您发出警告,因为它将始终具有默认值,但它仍然是初始化的。

编译器只能在没有明确赋值的情况下发现使用局部变量的情况。这是因为与类中方法之间的相比,编译器拥有更多关于方法内控制流的信息。如果你有一个方法将值分配给字段,另一个方法从字段中获取值,编译器就无法知道哪一个将首先被调用,而确定性分配规则允许它分析一个方法,以发现潜在的流,在该方法中,变量在没有首先被分配值的情况下被读取。

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

public Test() {}

这些字段仍然只有它们的默认值。

您的构造函数

  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);