【问题标题】:Empty constructor or no constructor空构造函数或没有构造函数
【发布时间】:2017-02-01 23:07:20
【问题描述】:

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

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

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

Class test
{
   public test()
   {

   }
        ......
}

Class test
{
        ......
}

【问题讨论】:

    标签: c#


    【解决方案1】:

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

    但是……

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

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

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

    【讨论】:

    • 在另一个话题上,如果你想在 COM 程序中使用你的 .NET 类,将需要一个公共的无参数构造函数——出于与 Soe Moe 解释的相同原因,我会明确说明在课堂上。
    • 如果您要以这种方式破坏 3rd 方客户端,您可能会争辩说您自己的单元测试应该失败。
    • 有时通过习惯性地使用某种模式来简化您的方法是可以的。这是我使用 javascript 分号的原因(因为我不想记住它们什么时候是必要的,什么时候它们是混乱的)。但是我认为在这种情况下,我会依靠单元测试来捕获错误,而不是到处放置空的构造函数。我想是个人喜好。无论如何,这个答案很好,因为它揭示了为什么人们更愿意显式添加空构造函数的逻辑。
    • 不过,当编译器生成默认构造函数时,技术上没有必要编写默认构造函数。您将它用作一种预防措施,不要忘记在添加另一个构造函数重载时指定一个。当使用无参数构造函数应该是受支持的用例时,应该通过单元测试来确保它,而不是用样板污染代码。
    【解决方案2】:

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

    来自horse's mouth

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

    【讨论】:

    • 澄清一下:如果你的类确实有至少一个具有一个或多个参数的构造函数,那么C#编译器将创建一个默认值构造函数为你。在这种情况下,您可能想要显式创建一个默认构造函数,即使它不做任何事情(即它是空的)。 (有关更多信息,请参阅已接受的答案和其他答案。)
    【解决方案3】:

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

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

    您还可以拥有一个私有的无参数构造函数,这有助于创建单例类。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 虽然序列化框架确实可以依赖于空的构造函数和可设置的属性,但这绝不是必需的。例如,Newtonsoft.Json 允许您使用任何构造函数进行反序列化。您只需使用 [JsonConstructor] 对其进行注释。
      【解决方案5】:

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

      如果您有另一个带参数的构造函数并且希望保持无参数构造函数处于活动状态,则您必须自己添加任何空构造函数 - 即使没有代码。

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

      【讨论】:

        【解决方案6】:

        C# 编译器会为您创建默认构造函数,因此您不应编写无参数的构造函数,主体为空。

        【讨论】:

        • 经验丰富的编码人员告诉我,没有它会在未来给他们带来问题,例如静态类
        【解决方案7】:

        我将包含一个空的无参数构造函数的唯一情况是,如果我希望构造函数是私有的,或者如果我希望无参数构造函数调用另一个以 null 作为参数的重载。顺便说一句,在上面的示例中,您通过未指定 public 将 Test 的构造函数设为私有。

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

        【讨论】:

        • 好的,我注意到它的原因是私有构造函数对于强制你的类的用户使用你可能决定包含在你的类中的任何工厂方法很有用。例如,我的 Foo 类可能有一个公共静态 Foo CreateFoo() 工厂方法并且没有公共构造函数...
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多