C# 在结构上隐藏无参数构造函数
是否可以在C#中对用户隐藏无参数构造函数 我想强制他们总是使用带参数的构造函数 e、 g.本职位结构C# 在结构上隐藏无参数构造函数,c#,.net,struct,C#,.net,Struct,是否可以在C#中对用户隐藏无参数构造函数 我想强制他们总是使用带参数的构造函数 e、 g.本职位结构 public struct Position { private readonly int _xposn; private readonly int _yposn; public int Xposn { get { return _xposn; } } public int Yposn { get
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坐标来更新位置
但是,无参数构造函数始终可用
我不能保密。甚至将其定义为公共的
我读过:
但这并没有真正的帮助
如果这是不可能的-什么是检测我被传递的位置是否有值的最佳方法
是否显式检查每个属性字段?有更巧妙的方法吗?结构实际上是一种内存存放方式的声明 即使在使用对象时,也会声明对象指针,而不管它是否为null 无法隐藏构造函数的原因是,结构要求CLR可以在内部创建它,因为它必须这样做 可以将此结构转换为对象以完成此任务。或者使用静态分析来确保在使用它之前它是初始化的
struct point
{
int xpos;
int ypos;
}
有一个谷歌的不可变对象,这似乎是你的追求。我相信他们正在寻找将这个特性(但不是在C#4中)添加到语言本身,因为这是一个常见的需求。这里是否特别需要一个结构?不,我们无法隐藏它。结构无法重新定义零参数构造函数,因此其可见性无法重新定义。您无法使用私有无参数构造函数创建结构,甚至无法声明无参数构造函数。你必须把它改成一个类。不允许结构声明无参数构造函数 从MSDN上的: 结构可以声明构造函数,但必须使用参数。为结构声明默认(无参数)构造函数是错误的。结构成员不能有初始值设定项。始终提供默认构造函数将结构成员初始化为其默认值 从MSDN上的: 11.3类别和结构差异 结构在几个重要方面与类不同:
- 结构是值类型(第节) 11.3.1)
- 所有结构类型都隐式继承 从类System.ValueType (第11.3.2节)。分配给 结构类型的变量创建一个 正在分配的值的副本 (第11.3.3节)
- 结构的默认值是 通过设置所有值生成的值 将字段键入其默认值 将所有引用类型字段设置为null (第11.3.4节)。拳击和 取消装箱操作用于 在结构类型和 对象(第11.3.5节)
- 这对我来说意义不同 结构(第11.3.6节)
- 实例的实例字段声明 结构不允许包含 变量初始值设定项(第节 11.3.7)
- 不允许声明结构 无参数实例构造函数 (第11.3.8节)。
- 结构不允许声明 析构函数(第11.3.9节)
不,你不能这样做。正如你所说,以前有人问过我,我认为答案相当清楚,你不能这样做 你可以,但不能用C。然而,即使你这样做了,也没有真正的帮助——因为你可以很容易地解决它:
MyStruct[] tmp = new MyStruct[1];
MyStruct gotcha = tmp[0];
这将是MyStruct的默认值——“全零”值,而无需调用构造函数
诚然,您可以轻松地向结构添加一个Validate方法,并在每次收到一个作为参数的方法时调用它 你这是什么意思?使用静态分析确保其初始化您的意思是检查每个字段是否有值?您可以使用规则运行静态分析工具,以确保任何时候有人在其代码中使用类型时,这两个值都是初始化的。或者你可以通过将它声明为一个对象来进行检查,然后在发布版本中更改为一个struct来完成一些花哨的工作。好吧,.NET允许你提供一个自定义的无参数构造函数-但是你不能直接在C#中完成,而且它也没有多大帮助,我认为这是一个可用性问题,比其他任何问题都重要。默认构造函数可能会生成有效的对象,但对于许多结构来说,它不是用户想要或期望的。尽管如此,有些人还是会使用默认构造函数,因为这是IDE给他们的第一个选项。然后,他们会遇到由本应填充数据的清零结构引起的令人困惑的错误,或者他们会浪费时间试图找出为什么不能在不可变结构上设置属性。从API设计的角度来看,我希望能够隐藏默认构造函数。+1@MB。私有默认构造函数会有所帮助,即使一个确定的“傻瓜”可以解决它。作为C++的盐,我认为