C# 构造函数为空或没有构造函数

C# 构造函数为空或没有构造函数,c#,C#,我认为在类(C#)中使用默认构造函数不是强制性的 那么,在这种情况下,我应该在类中有一个空构造函数,还是可以跳过它 拥有一个空的默认构造函数是一种最佳实践吗 Class test { public test() { } ...... } 或 -如果您的类不需要在默认构造函数中执行任何操作-不要定义它。编译器将为您生成一个 从: 除非类是静态的,否则类 如果没有构造函数,则给出一个 C语言的公共默认构造函数# 编译器,以便启用类 实例化 默认情况下,C#将为您

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

那么,在这种情况下,我应该在类中有一个空构造函数,还是可以跳过它

拥有一个空的默认构造函数是一种最佳实践吗

Class test
{
   public test()
   {

   }
        ......
}

-如果您的类不需要在默认构造函数中执行任何操作-不要定义它。编译器将为您生成一个

从:

除非类是静态的,否则类 如果没有构造函数,则给出一个 C语言的公共默认构造函数# 编译器,以便启用类 实例化

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

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


另一个需要添加空无参数构造函数的场景是,如果要将其访问修饰符从public更改为其他(private、protected或internal)

编译器将为您创建默认构造函数,因此您不应编写无参数构造函数,有一个空的主体。

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

没有什么比默认构造函数更好的了。它是C#中的公共无参数构造函数。C#编译器在编译时会在类中查找构造函数,如果没有定义构造函数,则会添加一个公共的无参数构造函数。因此,如果类对象不需要任何特殊的构造操作,那么可以跳过定义构造函数

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


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

我唯一会包含一个空的无参数构造函数的时候是,如果我希望构造函数是私有的,或者如果我希望无参数构造函数调用另一个以null作为参数的重载。顺便说一句,在上面的示例中,您通过不指定public使测试的构造函数成为私有的

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

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

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

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


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

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

但是

假设您已经发布了产品,第三方使用您的类。几个月后,出现了一个新的要求,要求您添加一个带参数的构造函数

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


在我看来,您应该始终为第三方使用的公共类定义空构造函数(一行)。

好的,我之所以提到它,是因为私有构造函数可以用于强制类的用户使用您可能决定包含在类中的任何工厂方法。例如,我的Foo类可能有一个公共静态Foo CreateFoo()工厂方法,但没有公共构造函数…在另一个主题中,如果您想在COM程序中使用.NET类,则需要一个公共无参数构造函数-原因与Soe Moe解释的相同,我会明确地把它放在课堂上。你可能会争辩说,如果你打算以这种方式破坏第三方客户机,你自己的单元测试应该失败。有时候,通过习惯性地使用某种模式来简化你的方法是可以的。这就是我使用javascript分号的原因(因为我不想记住什么时候需要分号,什么时候杂乱无章)。然而,我认为在这种情况下,我将依靠单元测试来捕获错误,而不是到处放置空构造函数。我想是个人喜好吧。不管怎样,这个答案很好,因为它揭示了为什么人们更愿意显式地添加空构造函数的逻辑。不过,当编译器生成一个构造函数时,在技术上不需要编写默认构造函数。您使用它只是作为预防措施,不要忘记在添加另一个构造函数重载后指定一个。当使用无参数构造函数被认为是受支持的用例时,它应该通过单元测试来确保,而不是用样板文件来污染代码。经验丰富的程序员告诉我,没有单元测试会在将来给他们带来问题,例如静态类要澄清的是:如果您的类确实至少有一个构造函数具有一个或多个参数,那么C#编译器将不会为您创建默认构造函数。在这种情况下,您可能希望显式创建默认构造函数,即使它不做任何事情(即,它是空的)。(更多信息,请参见公认的答案和其他答案。)虽然序列化框架当然可以依赖空构造函数和可设置属性,但这绝不是必需的。例如,Newtonsoft.Json允许您使用任何构造函数进行反序列化。您只需使用
[JsonConstructor]
对其进行注释即可。
class Foo
{
    public Foo()
        : this(null)
    {
    }

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