Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止使用默认构造函数_C# - Fatal编程技术网

C# 防止使用默认构造函数

C# 防止使用默认构造函数,c#,C#,有没有办法防止使用默认构造函数 我所能想到的就是抛出一个异常,但我希望它会导致编译时错误。将其设置为私有 所以 您可以将其设置为私有: private MyClass() { } 或者(如果您还不知道的话),如果您只是声明了一个带有参数的构造函数,那么编译器不会添加默认的构造函数,例如 private MyClass(string myParameter) { //Can't call new MyClass() anymore } 值得一提的是,其他人没有。默认构造函数应该仍然能够

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

我所能想到的就是抛出一个异常,但我希望它会导致编译时错误。

将其设置为私有

所以


您可以将其设置为私有:

private MyClass()
{
}
或者(如果您还不知道的话),如果您只是声明了一个带有参数的构造函数,那么编译器不会添加默认的构造函数,例如

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

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

private MyClass()
{
}

public MyClass(string something) : this()
{
}
这就解决了问题。但是,请注意,如果类未密封,则受保护实际上可能是首选实现。

    如果类中的每一个都是静态的,请考虑将其设为静态类。那样的话,你根本就不会得到一个构造函数
  • 如果您想要一个无参数构造函数,但不希望它是公共的,请显式声明它并将其设为私有(或内部等)
  • 如果您不想要无参数构造函数,但想要带参数的构造函数,那么只需声明参数化构造函数-默认构造函数将不会为您生成

我想这应该涵盖所有的基础…

你说的和我刚才键入的差不多:)我希望我很久以前就知道静态类。除非它是一个结构而不是一个类。如果是这种情况,则会生成默认的ctor(这是一件好事,因此所有的道具都已初始化),但可调用(不幸的是)-即,我想强制用户使用带参数的ctor。@DaveBlack:那么您在数组、字段等方面会遇到问题。很难解决带默认值的结构的问题。不确定这是否是一个好主意,但我将支持字段设置为可空,并在属性中返回它们的值。因此,如果不小心使用了默认的构造函数,那么稍后调用这些属性时会出现异常。如果这样做,您可能会遇到问题:在.NET中,许多事情(绑定/序列化等)都需要一个默认的无参数构造函数。考虑通过构造函数PARAMs设置任何需要设置的值默认值。在您的情况下,这可能无关紧要,但值得一提。除非您在类型(或嵌套类型)中需要它,否则您可以在此处完全删除它-只有在没有显式声明构造函数的情况下才会生成它。@Jon我通常是一个有腰带和吊带的人,所以我通常都是这样做的;这样的话,我想做的对任何人来说都是清楚的。如果我忘记了,很高兴知道它是由编译器自动处理的。我会通过在参数构造函数上添加注释来实现这一点:“如果删除此构造函数,请确保没有公共默认构造函数”或类似的内容。目前,这段代码基本上允许您在类中创建一个没有任何参数的实例。如果存在任何只读变量,它也会导致问题,因为您必须为它们赋值…@Jon一如既往,细节是关键(我没有想到在这个类中创建无参数实例的能力)。非常感谢你的提示。
private MyClass()
{
}

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