隐藏struct上的无参数构造函数

是否可以在c#中隐藏用户的无参数构造函数

我想强制他们总是使用带参数的构造函数

例如这个职业课程

public struct Position { private readonly int _xposn; private readonly int _yposn; public int Xposn { get { return _xposn; } } public int Yposn { get { return _yposn; } } public Position(int xposn, int yposn) { _xposn = xposn; _yposn = yposn; } } 

我只希望用户能够通过指定x和y坐标来新建位置

但是,无参数构造函数始终可用

我不能把它私有化。 甚至将其定义为公开

我已经读过这个为什么我不能在.NET中为结构定义默认构造函数?

但它并没有真正的帮助

如果这是不可能的 – 检测我被传递的位置是否具有值的最佳方法是什么?

明确检查每个属性字段? 有一种更光滑的方式吗?

谢谢

不,你不能这样做。 如你所说,之前已经提出了类似的问题 – 我认为答案很明确,你不能这样做。

可以 为结构创建私有无参数构造函数 ,但不能在C#中创建。 但是,即使你这样做也没有用 – 因为你可以轻松地解决它:

 MyStruct[] tmp = new MyStruct[1]; MyStruct gotcha = tmp[0]; 

这将是MyStruct的默认值 – “全零”值 – 无需调用构造函数。

您可以轻松地向结构中添加Validate方法,并在每次收到一个作为参数时调用它。

不能隐藏它。 结构无法重新定义零arg构造函数,因此无法重新定义其可见性。

那么一个结构实际上是一个关于内存将如何存在的声明。

即使使用对象,也会声明对象指针IS,无论它是否为null。

你无法隐藏构造函数的原因是因为结构要求CLR可以在内部创建它,它必须这样做。

您可以将此结构转换为对象以实现此任务。 或者使用静态分析以确保在使用之前初始化它?

 struct point { int xpos; int ypos; } 

有一个谷歌的不可变对象,这似乎是你的后。 我相信他们希望将这个function(但不是在C#4中)添加到语言本身,因为这是一个常见的要求。 这里是否特定需要结构?

您不能使用私有无参数构造函数创建结构,甚至不能声明无参数构造函数。 你必须把它改成一个类。 结构不允许声明无参数构造函数。

来自MSDN上的Structs Tutorial :

结构可以声明构造函数,但它们必须使用参数。 声明struct的默认(无参数)构造函数是错误的。 Struct成员不能有初始化器。 始终提供默认构造函数以将struct成员初始化为其默认值。

来自MSDN上的C#规范 :

11.3类和结构的差异

结构在几个重要方面与类不同:

  • 结构是值类型(第11.3.1节)。
  • 所有结构类型都隐式inheritance自System.ValueType类(第11.3.2节)。 对结构类型变量的赋值会创建所分配值的副本(第11.3.3节)。
  • struct的默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为null而生成的值(第11.3.4节)。 装箱和拆箱操作用于在结构类型和对象之间进行转换(第11.3.5节)。
  • 结构的含义不同(第11.3.6节)。
  • 不允许结构的实例字段声明包含变量初始值设定项(第11.3.7节)。
  • 不允许结构体声明无参数实例构造函数(第11.3.8节)。
  • 不允许结构体声明析构函数(第11.3.9节)。