如果我们在类中只有一个参数化的构造函数,那为什么不能使用默认构造函数创建对象?与添加参数化构造函数之前一样,类中没有默认的构造函数!仍然可以通过默认构造函数创建lass实例。但是,在添加参数化构造函数之后,默认构造函数将停止工作。为什么?
有人可以解释吗?
class Program
{
static void Main(string[] args)
{
Test test = new Test(); //instance created using parameterized constructor
Test2 test = new Test2(); //instance can not be created using default constructor
}
class Test
{
//no constructor present
}
class Test2
{
public Test2(int a)
{
//parameterized constructor present
}
}
}
答案 0 :(得分:8)
如果您不添加任何构造函数,则编译器会为您添加无参数构造函数作为默认构造函数。
如果添加任何构造函数,则不会添加默认构造函数。如果仍然需要无参数构造函数,则需要手动添加。
官方docs说:
像这样的不带参数的构造函数称为默认构造函数。
[....]
如果类没有构造函数,则会自动生成默认构造函数,并使用默认值初始化对象字段。
添加参数化构造函数时,基本上是在说此类需要这些特定参数才能正确初始化。如果无参数构造函数仍然有效,则无法强制使用该特定构造函数。您必须定义一个私有的默认构造函数,以免被使用。
答案 1 :(得分:3)
这就是语言的设计方式。可以强制您始终指定类的作者指定的参数。
想象一下,如果您有一个类,则必须提供一个非负数以使其生效。如果该类接受了默认的构造函数,那么您已经创建了该类无效的情况。因此,如果您希望默认构造函数可用,那么如果类的作者添加了带有参数的构造函数,则必须明确地将其放入。
您需要执行以下操作:
class Test2
{
public Test2() { }
public Test2(int a)
{
//parameterized constructor present
}
}
答案 2 :(得分:-1)
默认情况下,如果未创建任何构造函数,则将默认构造函数分配给class以便对其进行初始化。
现在,如果您创建了参数化的构造函数,则除非您定义或添加了该无参数的构造函数,否则不会在该类上创建任何默认构造函数。
基于Microsoft docs,这是正在发生的事情:
除非类是静态的,否则C#编译器将为没有构造函数的类提供一个公共默认构造函数,以启用类实例化。