Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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认证问题)_C# - Fatal编程技术网

C# 在结构类型中声明具有私有集的属性错误?(测量c认证问题)

C# 在结构类型中声明具有私有集的属性错误?(测量c认证问题),c#,C#,我正在模拟微软的C认证,我遇到了以下问题: 在下图中,我们可以看到我选择了第三个选项,但是,根据模拟,正确答案将是最后一个选项: 我知道不在构造函数之外公开结构类型的成员是一种很好的做法,因此我选择了setter是私有的并通过构造函数进行设置的选项 我做了一个结构,使用私有集属性时没有编译或执行错误: class Program { static void Main(string[] args) { var test = new TestClass(1);

我正在模拟微软的C认证,我遇到了以下问题:

在下图中,我们可以看到我选择了第三个选项,但是,根据模拟,正确答案将是最后一个选项:

我知道不在构造函数之外公开结构类型的成员是一种很好的做法,因此我选择了setter是私有的并通过构造函数进行设置的选项

我做了一个结构,使用私有集属性时没有编译或执行错误:

class Program
{
    static void Main(string[] args)
    {
        var test = new TestClass(1);
    }

}

struct TestClass
{
    public TestClass(int value)
    {
        this.MyProperty = value;
    }
    public int MyProperty { get; private set; }
}
对练习的解释如下,我真的不明白:
不幸的是,这个问题已经过时了

在早期版本的C中,在结构中声明这样的属性确实是一个问题。在初始化结构之前,不允许访问属性,但在不访问属性的情况下,不能初始化备份字段。这是第二十二条军规。在这些版本中,正如测试提供给您的解释性文本所说,解决这个问题的方法是:在构造函数声明中包含:这一点,以便遵循初始化规则

然而,正如您自己的测试所示,情况不再如此。C放宽了结构初始化规则,允许初始化结构中自动实现的属性

这是一个不幸的问题。坦率地说,即使C结构初始化规则没有改变,问题本身也助长了可变结构以及将字段公开为公共的糟糕做法。尽管在Microsoft发布的代码中有类似的示例,但调用无参数构造函数以便使用自动实现的属性是否真的那么困难,这是一个非常有争议的问题。即使你决定这样做,并因此选择将成员字段改为可写字段,这些字段是否应该是可写字段而不是只读字段也是有争议的


通常的论点是这样的,这个数据结构需要是可变的,以便可以更有效地更新值,或者在互操作中使用值,或者其他什么,当然在某些情况下这些论点是有效的。但我认为这并不一定支持为了测试问题的目的而假设这些特殊情况的想法。

不幸的是,这个问题已经过时了

在早期版本的C中,在结构中声明这样的属性确实是一个问题。在初始化结构之前,不允许访问属性,但在不访问属性的情况下,不能初始化备份字段。这是第二十二条军规。在这些版本中,正如测试提供给您的解释性文本所说,解决这个问题的方法是:在构造函数声明中包含:这一点,以便遵循初始化规则

然而,正如您自己的测试所示,情况不再如此。C放宽了结构初始化规则,允许初始化结构中自动实现的属性

这是一个不幸的问题。坦率地说,即使C结构初始化规则没有改变,问题本身也助长了可变结构以及将字段公开为公共的糟糕做法。尽管在Microsoft发布的代码中有类似的示例,但调用无参数构造函数以便使用自动实现的属性是否真的那么困难,这是一个非常有争议的问题。即使你决定这样做,并因此选择将成员字段改为可写字段,这些字段是否应该是可写字段而不是只读字段也是有争议的


通常的论点是这样的,这个数据结构需要是可变的,以便可以更有效地更新值,或者在互操作中使用值,或者其他什么,当然在某些情况下这些论点是有效的。但我认为这并不一定支持为了测试问题的目的而假设这些特殊情况的想法。

请参见第2段的最后一句,因为编译器在使用结构时不需要使用任何构造函数。因为编译器可能未在构造函数中初始化结构,所以私有setter意味着编译器无法初始化该值。谢谢,这很有意义,如果我没有构造函数,我将永远无法初始化私有属性。但是这个例子给了我一个构造函数,所以属性将通过它初始化。否?您不能保证用户始终使用带参数的ctor。可以随时调用new Point3d。请参见第2段的最后一句,因为编译器在使用结构时不需要使用任何构造函数。因为编译器可能未在构造函数中初始化结构,所以私有setter意味着编译器无法初始化该值。谢谢,如果我没有
作为一个构造函数,我永远无法初始化私有属性。但是这个例子给了我一个构造函数,所以属性将通过它初始化。否?您不能保证用户始终使用带参数的ctor。人们总是可以称之为新的Point3d。