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

问题描述 投票:1回答:3

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

    }

}
c# oop
3个回答
8
投票

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

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

官方docs说:

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

[....]

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

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


3
投票

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

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

你需要这样做:

class Test2
{
    public Test2() { }

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

}

-1
投票

默认情况下,如果没有创建构造函数,则为类提供默认构造函数以使其初始化。

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

基于Microsoft docs,这是正在发生的事情:

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

© www.soinside.com 2019 - 2024. All rights reserved.