C#6允许在结构上声明无参数构造函数。但是它们必须是公共的,并且有些人希望强迫其他开发人员使用参数化构造函数,所以我想知道从CLR角度来看,通过在内部抛出异常来使无参数构造函数无法使用是可以的,所以它会看起来像那样:
public struct Foo
{
public Foo()
{
throw new InvalidOperationException("This constructor is not supported.");
}
public Foo(int i) { ... }
}
答案 0 :(得分:3)
你可以做到。至于它是否是一个好主意是相当主观的。 (我强烈反对它的使用,但显然我不能停止你这样做。)
如果你的目标是确保永远不会在没有调用参数化构造函数的情况下构造对象的情况,并且字段永远不会保留其默认值,则不会这样做。有一些方法,比如使用default(Foo)
创建对象的实例而不调用任何用户定义的构造函数。
如果你问CLR是否会崩溃并且世界会因为你从struct
的构造函数中抛出异常而陷入黑洞,那么不会,这不会发生。在调用此构造函数时,它会抛出并向上移动调用堆栈直到被捕获,就像任何其他抛出的异常一样。