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

时间:2009-02-11 03:41:00

标签: 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 { 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?

但它并没有真正帮助

如果无法做到这一点 - 检测我传递的位置是否有值的最佳方法是什么?

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

感谢

4 个答案:

答案 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类和结构差异

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

  • 结构是值类型(Section 11.3.1)。
  • 所有结构类型都隐式继承 来自System.ValueType类 (第11.3.2节)。转让给一个 struct类型的变量创建一个 所分配值的副本 (第11.3.3节)。
  • 结构的默认值是 通过设置所有值产生的值 将字段键入其默认值 和所有引用类型字段为null (第11.3.4节)。拳击和 取消装箱操作用于 转换结构类型和 对象(第11.3.5节)。
  • 这个的含义是不同的 结构(第11.3.6节)。
  • a的实例字段声明 struct不允许包含 变量初始化器(Section 11.3.7)。
  • 不允许声明结构 无参数实例构造函数 (第11.3.8节)。
  • 不允许声明结构 析构函数(第11.3.9节)。