38

是否可以在 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 中的结构定义默认构造函数?

但它并没有真正帮助。

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

明确检查每个属性字段?有没有更流畅的方法?

4

4 回答 4

38

不,你不能这样做。正如您所说,以前曾提出过类似的问题-我认为答案很清楚,您无法做到。

可以 为 struct 创建私有无参数构造函数,但不能在 C# 中。然而,即使你这样做了,它并没有真正的帮助 - 因为你可以轻松地解决它:

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

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

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

于 2009-02-11T07:33:16.933 回答
5

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

于 2009-02-11T03:47:53.777 回答
3

一个结构实际上是一个关于内存将如何放置的声明。

即使你使用一个对象,对象指针也会被声明,不管它是否为空。

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

您可以将此结构转换为对象以完成此任务。还是使用静态分析来确保在使用之前对其进行初始化?

struct point
{
   int xpos;
   int ypos;
}

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

于 2009-02-11T03:47:34.217 回答
3

您不能使用私有无参数构造函数创建结构,甚至不能声明无参数构造函数。您必须将其更改为课程。不允许结构声明无参数构造函数。

来自MSDN 上的Structs 教程:

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

从MSDN 上的C# 规范:

11.3 类和结构的区别

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

  • 结构是值类型(第 11.3.1 节)。
  • 所有结构类型都隐式继承自 System.ValueType 类(第 11.3.2 节)。对结构类型变量的赋值会创建一个被赋值的值的副本(第 11.3.3 节)。
  • 结构的默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为空而产生的值(第 11.3.4 节)。装箱和拆箱操作用于在结构类型和对象之间进行转换(第 11.3.5 节)。
  • 这对结构的含义是不同的(第 11.3.6 节)。
  • 结构的实例字段声明不允许包含变量初始值设定项(第 11.3.7 节)。
  • 不允许结构声明无参数实例构造函数(第 11.3.8 节)。
  • 不允许结构声明析构函数(第 11.3.9 节)。
于 2009-02-11T05:42:52.083 回答