【问题标题】:Prevent usage of default constructor防止使用默认构造函数
【发布时间】:2026-01-03 06:35:01
【问题描述】:

有没有办法阻止使用默认构造函数?

我能想到的只是抛出一个异常,但我想要一些会导致编译时错误的东西。

【问题讨论】:

  • 如果您这样做,您可能会遇到麻烦:在 .NET 中,许多事情(绑定/序列化/等)都需要默认的无参数构造函数。考虑为您需要通过构造函数参数设置的任何值设置默认值。这对您而言可能无关紧要,但值得一提。
  • 一个 hack:过时的属性

标签: c#


【解决方案1】:
  • 如果类中的所有内容都是静态的,请考虑将其设为静态类。这样一来,您根本不会得到构造函数。
  • 如果您想要一个无参数构造函数但又不希望它公开,请显式声明它并将其设为私有(或内部等)
  • 如果您不想要无参数构造函数,但确实想要带参数的构造函数,那么只需声明参数化构造函数 - 不会为您生成默认构造函数

认为应该涵盖所有基础......

【讨论】:

  • 你说的和我刚才输入的差不多 :)
  • 我希望我很久以前就知道静态类。
  • 除非它是一个结构而不是一个类。如果是这种情况,则会生成默认 ctor(一件好事,因此所有道具都已初始化)但可调用(不幸的是) - 即我想强制用户使用带有参数的 ctor。
  • @DaveBlack:那么你会遇到数组、字段等问题。很难解决具有默认值的结构的问题。
  • 不确定这是否是个好主意,但我将支持字段设置为可为空并在属性中返回它们的值。所以如果不小心使用了默认的ctor,后面调用这些属性的时候就会出现异常。
【解决方案2】:

将其设为私有。

所以,

class SomeClass
{
    private SomeClass()
    {
    }

    public SomeClass(int SomeParam)
    {
    }
}

【讨论】:

  • 除非您在类型(或嵌套类型)中需要它,否则您可以在此处完全删除它 - 只有在没有显式声明构造函数时才会生成它。
  • @Jon 我通常喜欢穿腰带和吊带裤,所以无论如何我通常都会这样做;这样,任何看到它的人都清楚我正在尝试做的事情。很高兴知道它是由编译器自动处理的,如果我忘记了。
  • 我将通过在参数构造函数上添加注释来实现这一点:“如果您删除此构造函数,请确保没有公共默认构造函数”或类似的内容。目前,此代码基本上允许您在类中创建没有任何参数的实例。如果有任何只读变量也会导致问题,因为您必须为它们分配值...
  • @Jon 与往常一样,魔鬼在细节中(我没有想过能够在 inside 这个类中创建无参数实例)。非常感谢您的提示。
【解决方案3】:

您可以将其设为私有:

private MyClass()
{
}

或者(如果您还不知道)如果您只是声明一个带参数的构造函数,则编译器不会添加默认构造函数,例如

private MyClass(string myParameter)
{
    //Can't call new MyClass() anymore
}

【讨论】:

    【解决方案4】:

    有一件事要提,其他人没有。默认构造函数应该仍然能够设置默认实现位,以避免重用。如果它是私有的,这不是问题,因为您仍然可以链接到私有构造函数。你只是让它对外部资源不可用。

    private MyClass()
    {
    }
    
    public MyClass(string something) : this()
    {
    }
    

    这样就解决了问题。但是请注意,如果类不是密封的,则 protected 实际上可能是首选实现。

    【讨论】: