繁体   English   中英

为什么在添加参数化构造函数时默认构造函数不起作用?

[英]Why default constructor does not work when parameterized constructor added?

如果我们在类中只有一个参数化的构造函数,那为什么不能用默认构造函数创建对象呢? 与添加参数化构造函数之前一样,类中没有默认的构造函数! 仍然可以通过默认构造函数创建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
        }

    }

}

如果您不添加任何构造函数,则编译器会为您添加无参数构造函数作为默认构造函数。

如果添加任何构造函数,则不会添加默认构造函数。 如果仍然需要无参数构造函数,则需要手动添加它。

官方文档说:

像这样的不带参数的构造函数称为默认构造函数。

[....]

如果类没有构造函数,则会自动生成一个默认构造函数,并使用默认值初始化对象字段。

当您添加参数化的构造函数时,您基本上是在说此类需要这些特定的参数才能正确初始化。 如果无参数构造函数仍然有效,则无法强制使用该特定构造函数。 您必须定义一个私有的默认构造函数,以避免使用它。

这就是语言的设计方式。 可以强制您始终指定类的作者指定的参数。

想象一下,如果您有一堂课,您必须提供一个非负数以使其有效。 如果该类接受了默认的构造函数,那么您已经创建了该类无效的情况。 因此,如果您希望默认构造函数可用,那么如果类的作者添加了带有参数的构造函数,则必须明确地将其放入。

您需要这样做:

class Test2
{
    public Test2() { }

    public Test2(int a)
    {
        //parameterized constructor present
    }

}

默认情况下,如果未创建构造函数,则将默认构造函数分配给class以使其能够初始化。

现在,如果您创建了参数化的构造函数,则除非您定义或添加了该无参数的构造函数,否则不会在该类上创建任何默认构造函数。

根据Microsoft 文档,这是正在发生的事情:

除非类是静态的,否则C#编译器会为没有构造函数的类提供一个公共默认构造函数,以启用类实例化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM