一位同事问我这个问题,我们应该在类中始终包含默认构造函数吗?如果是,为什么?如果没有,为什么不呢?

100

public class Foo {

    Foo() { }

    Foo(int x, int y) {
        ...
    } 

}

我也有兴趣从专家那里了解这方面的情况.

推荐答案

您必须记住,如果不提供重载构造函数,编译器将为您生成默认构造函数.也就是说,如果你有

public class Foo
{ 
} 

编译器将生成以下内容:

public class Foo
{ 
    public Foo() { }  
} 

但是,只要添加另一个构造函数

public class Foo
{ 
    public Foo(int x, int y)
    { 
        // ... 
    }  
} 

编译器将不再自动为您生成默认构造函数.如果该类已经在依赖默认构造函数Foo f = new Foo();的其他代码中使用,那么该代码现在就会中断.

如果您不希望有人能够在不提供数据的情况下初始化该类,那么应该创建一个默认构造函数,该构造函数为private,以明确说明您正在阻止在没有输入数据的情况下构造实例.

但是,有时需要提供默认构造函数(无论是公共的还是私有的).如前所述,某些类型的序列化需要默认构造函数.有时,一个类有多个参数化构造函数,但也需要"较低级别"的初始化,在这种情况下,可以使用一个私有的默认构造函数,该构造函数链接到参数化构造函数中.

public class Foo
{
   private Foo()
   {
      // do some low level initialization here
   }

   public Foo(int x, int y)
      : this()
   {
      // ...
   }

   public Foo(int x, int y, int z)
      : this()
   {
      // ...
   }
}

.net相关问答推荐

API响应返回null错误. NET MAUI

无法在Designer、VS2022、. NET 8中打开WinForms表单'

.NET最小API BadRequest响应不返回正文

竖线在 PropertyGroup .csproj 文件中的含义

是否有内置方法将 nuget 包引用为 csproj 中的文件?

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

如何手动注入依赖注入

为什么 GetShortestDayName 返回的名称比预期的短?

C#6.0 字符串插值本地化

我可以从 .NET/C# 获取其他进程的命令行参数吗?

如何删除只读文件?

.NET 等价于旧的 vb left(string, length) 函数

C# 属性实际上是方法吗?

如何更改 double.ToString() 中小数点的符号?

什么版本的 .NET 附带什么版本的 Windows?

我们应该总是在类中包含一个默认构造函数吗?

为什么 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

Dispatcher.CurrentDispatcher 与 Application.Current.Dispatcher

将控制台输出镜像到文件

枚举和匹配属性的 C# 命名约定