空构造函数或没有构造函数

时间:2010-06-03 06:30:43

标签: c#

我认为在类(C#)中使用默认构造函数并不是强制性的。

那么,在那种情况下,我应该在课堂上有一个空构造函数,还是可以跳过它?

拥有一个空的默认构造函数是最佳做法吗?

Class test
{
   public test()
   {

   }
        ......
}

Class test
{
        ......
}

8 个答案:

答案 0 :(得分:66)

如果第三方不使用该类,并且您不需要重载构造函数,请不要编写空构造函数。

但是...

想象一下,您已经发运了产品,第三方使用了您的课程。几个月之后,有一个新的要求会让你添加一个带参数的构造函数。

现在,通过这样做,C#编译器不再生成默认构造函数。如果您没有显式添加空构造函数,则第三方代码将中断。

在我看来,你应该总是为第三方使用的公共类定义空构造函数(一个班轮)。

答案 1 :(得分:34)

KISS - 如果你的类不需要在默认构造函数中做任何事情 - 不要定义它。编译器将为您生成一个。

来自horse's mouth

  

除非类是静态的,否则是类   没有构造函数给出了   C#的公共默认构造函数   编译器以启用类   实例

答案 2 :(得分:8)

There's nothing like default constructors。它是C#中的公共参数构造函数。 C#编译器在编译时会在类中查找构造函数,如果没有定义构造函数,则会添加一个无公共参数的构造函数。因此,如果类对象不需要任何特殊的构造操作,则可以跳过定义构造函数。

其次,如果您使用参数定义一个构造函数,则编译器将不会添加公共无参数构造函数,因为编译器将假定您的对象必须通过您定义的构造函数构造。话虽如此,如果您需要使用参数化构造函数构造对象,则必须显式定义无参数构造函数。

你也可以拥有一个私有的无参数构造函数,它有助于制作单例类。

答案 3 :(得分:4)

如果您不需要无参数构造函数,请不要添加一个空体。但是,如果有人想序列化/反序列化您的类的对象,那么您将需要一个无参数构造函数。

如果您没有定义构造函数,那么编译器将自动为您生成一个默认的无参数构造函数,但如果您自己定义构造函数则不会。

顺便说一句,您可以通过定义一个空的私有构造函数来抑制C#编译器自动生成的默认构造函数。

答案 4 :(得分:3)

默认情况下,C#将为您添加零参数构造函数。所以如果你没有特别的东西,不要加一个。

你必须自己添加任何空构造函数 - 即使没有代码 - 如果你有另一个带参数的构造函数,并且想要让无参数构造函数保持活动状态。

另一种情况是,如果要将其访问修饰符从公共更改为其他(私有,受保护或内部),则需要添加空的无参数构造函数

答案 5 :(得分:2)

C#编译器将为您创建默认构造函数,因此您不应该使用空体来编写无参数构造函数。

答案 6 :(得分:2)

我只包括一个空的无参数构造函数是因为我希望构造函数是私有的,或者我是否希望无参数构造函数以null作为参数调用另一个重载。顺便说一下,在上面的例子中,你通过不指定public来使Test的构造函数变为私有。

class Foo
{
    public Foo()
        : this(null)
    {
    }

    public Foo(string bar)
    {
        if (bar != null)
        {
            Console.WriteLine(bar);
        }
    }
}

答案 7 :(得分:0)

不要写一个空构造函数,默认情况下会创建它