如何在C#中的结构上强制使用工厂

BCS*_*BCS 3 c# struct factory

我有ac#struct,我需要禁止在其上调用no args构造函数.

MyStruct a;
/// init a by members   // OK
MyStruct b = MyStruct.Fact(args); // OK, inits by memebers

MyStruct s = new MyStruct(); // can't have that
Run Code Online (Sandbox Code Playgroud)

我这样做主要是为所有成员强制explicet值,因为没有有效的默认值,并且所有成员必须具有有效值.

在C++中,这很容易,添加一个私有构造函数,但c#不允许这样做.

有没有办法防止上述情况?

我真的需要强制使用工厂,因此阻止所有公共构造函数调用也会起作用.


完整的披露:为了避免单声道依赖,c#app会被自动转换为D,new Struct()从而产生一个指针,这对我来说很糟糕.然而,这个问题是相关的,尽管如此,请忽略它.

Jon*_*eet 11

你不能.根据C#中的定义,所有结构都有一个公共无参数构造函数.(在CLR中,它们几乎都没有,但它们总是可以像它们一样.)请参阅这个问题,了解为什么你不能在结构上定义自己的无参数构造函数(无论如何,在C#中).

实际上,如果您乐意在IL中编写值类型,则可以阻止此语句.我刚刚检查过,如果你确定你的值类型只有一个无参数构造函数,并将其设置为内部,那么你将无法编写MyStruct ms = new MyStruct();但是这不会阻止:

MyStruct[] array = new MyStruct[1];
MyStruct ms = array[0];
Run Code Online (Sandbox Code Playgroud)

它适用于新的限制 - 所以它并没有真正为你买任何东西.这真的很不错,因为在IL中搞乱会很混乱.

你确定你真的想要首先编写一个结构吗?这几乎不是一个好主意.