是否可以在c#
中隐藏用户的无参数构造函数我想强制他们总是使用带参数的构造函数
e.g。这个职位类
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坐标
来新建位置但是,无参数构造函数始终可用
我不能把它私有化。甚至将其定义为公共
我读过这个 Why can't I define a default constructor for a struct in .NET?
但它并没有真正帮助
如果无法做到这一点 - 检测我传递的位置是否有值的最佳方法是什么?
明确检查每个属性字段?有一种更光滑的方式吗?
感谢
答案 0 :(得分:28)
不,你不能这样做。如你所说,similar question之前曾被问及 - 我认为答案很清楚,你不能这样做。
你可以 create a private parameterless constructor for a struct,但不能用于C#。但是,即使你这样做也没有用 - 因为你可以轻松地解决它:
MyStruct[] tmp = new MyStruct[1];
MyStruct gotcha = tmp[0];
这将是MyStruct的默认值 - “全零”值 - 无需调用构造函数。
您可以轻松地向结构中添加Validate方法,并在每次收到一个作为参数时调用它。
答案 1 :(得分:4)
不能隐藏它。结构无法重新定义零arg构造函数,因此无法重新定义其可见性。
答案 2 :(得分:2)
一个结构实际上是一个关于记忆将如何存在的声明。
即使使用对象,也会声明对象指针IS,无论它是否为空。
你无法隐藏构造函数的原因是因为结构要求CLR可以在内部创建它,它必须这样做。
您可以将此结构转换为对象以实现此任务。或者在使用之前使用静态分析来确保它是初始化的?
struct point
{
int xpos;
int ypos;
}
有一个谷歌的不可变对象,这似乎是你的后。我相信他们希望将这个功能(但不是在C#4中)添加到语言本身,因为这是一个常见的要求。这里是否特别需要结构?
答案 3 :(得分:2)
您不能使用私有无参数构造函数创建结构,甚至不能声明无参数构造函数。你必须把它改成一个类。结构不允许声明无参数构造函数。
来自MSDN上的Structs Tutorial:
结构可以声明构造函数,但它们必须带参数。声明struct的默认(无参数)构造函数是错误的。 Struct成员不能有初始化器。始终提供默认构造函数以将结构成员初始化为其默认值。
来自MSDN上的C# specification:
11.3类和结构差异
结构在几个重要方面与类不同: