Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在结构上隐藏无参数构造函数_C#_.net_Struct - Fatal编程技术网

C# 在结构上隐藏无参数构造函数

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

是否可以在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坐标来更新位置

但是,无参数构造函数始终可用

我不能保密。甚至将其定义为公共的

我读过:

但这并没有真正的帮助

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


是否显式检查每个属性字段?有更巧妙的方法吗?

结构实际上是一种内存存放方式的声明

即使在使用对象时,也会声明对象指针,而不管它是否为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++的盐,我认为私下< /COD>作为一个提示,不要在脚上开枪,使用指针总是有一个工作。数组语义可以通过不允许创建此类结构的数组来解决。嘿,Jon,关于结构的参数化构造函数,有一件事。如果你能像我在某处读到的那样验证它。结构的参数化构造函数仍然调用默认的无参数构造函数(在FCL中为结构预定义的构造函数),作为其执行的第一件事。我相信实现这种行为涉及到一个编译器技巧。@RBT:C#6中围绕这一点有一些变化,关于是否需要显式地这样做才能使自动实现的属性工作,但除此之外,我认为这是不容易观察到的,除非您通过IL添加一个自定义的无参数构造函数。。。我的经验是,它并不总是被调用,但我怀疑它是从参数化构造函数调用的。。。我必须检查一下,但这并不是我在实际代码中见过的东西。