防止使用默认构造函数

Far*_*nha 52 c#

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

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

Jon*_*eet 101

  • 如果类中的所有内容都是静态的,请考虑将其设置为静态类.这样,你根本就得不到构造函数.
  • 如果你想要一个无参数构造函数,但你不希望它是公共的,那么明确声明它并将其设为私有(或内部等)
  • 如果你不想参数的构造函数,但想带参数的构造函数,那么就宣告那些-默认构造函数不会为你生成

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

  • 除非,它是一个结构而不是一个类.如果是这种情况,则会生成默认的ctor(这是一件好事,所以所有的道具都被初始化)但是可以调用(不幸的是) - 即我想强迫用户使用带有参数的ctor. (2认同)
  • @DaveBlack:那么你就会遇到数组、字段等问题。很难解决具有默认值的结构问题。 (2认同)

Mic*_*odd 39

把它私有化.

所以,

class SomeClass
{
    private SomeClass()
    {
    }

    public SomeClass(int SomeParam)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 除非你在类型(或嵌套类型)中需要它,否则你可以在这里完全删除它 - 只有在没有显式声明构造函数的情况下才会生成它. (11认同)
  • 我会通过在参数构造函数上添加注释来实现这一点:"如果删除此构造函数,请确保没有公共默认构造函数"或者沿着这些行.目前,此代码基本上允许您在类中创建没有任何参数的实例.如果存在任何只读变量,它也会导致问题,因为您必须为它们分配值... (3认同)

Pao*_*olo 9

你可以把它变成私人的:

private MyClass()
{
}
Run Code Online (Sandbox Code Playgroud)

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

private MyClass(string myParameter)
{
    //Can't call new MyClass() anymore
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*mer 6

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

private MyClass()
{
}

public MyClass(string something) : this()
{
}
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.但请注意,如果类没有密封,受保护实际上可能是首选实现.