关于默认构造函数的困惑
本文关键字:构造函数 默认 于默认 | 更新日期: 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()
{
}
如果你想初始化num1
和num2
,你可以按如下方式进行:
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);