当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在struct上隐藏无参数构造函数》经验,为你挑选了2个好方法。

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

但它并没有真正的帮助

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

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

谢谢



1> Jon Skeet..:

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

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

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

这将是MyStruct的默认值 - "全零"值 - 无需调用构造函数.

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


我认为这是一个可用性问题,而不是其他任何问题.默认构造函数可能会生成_valid_对象,但对于许多结构,它不会是用户想要或期望的结果.尽管如此,有些人会使用该默认构造函数,因为它是IDE为其提供的第一个选项.然后他们将会出现由应该填充数据的归零结构引起的混乱错误,或者他们会浪费时间试图弄清楚为什么他们不能在不可变结构上设置属性.从API设计的角度来看,我希望可以隐藏默认构造函数.
+1 @MB.私有默认构造函数会有所帮助,即使确定的"傻瓜"可以解决它.作为一个C++盐,我认为"私人"是一种暗示不要在脚下射击的暗示,总有一种使用指针的解决方法.并且可以通过不允许创建这种结构的数组来处理数组语义.

2> DavidN..:

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

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有