c#中struct和property的问题

use*_*291 33 c# struct

在一个文件中我定义了一个公共结构

public struct mystruct
{
    public Double struct1;
    public Decimal struct2;
}
Run Code Online (Sandbox Code Playgroud)

在另一个我尝试这样做:

class Test
{
    mystruct my_va;

    public mystruct my_va
    {
        get { return my_va; }
        set { my_va = value; }
    }

    public Test()
    {
        my_va.struct1 = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

Intellisense识别My_va.struct1,但编译器说

错误1无法修改'TEST.mystruct'的返回值,因为它不是变量

如何更正语法?

Jon*_*eet 49

是的,这是绝对正确的.你看,当你获取时 My_va,你正在获取一个值 - 当前值的副本my_va.更改该值将没有任何好处,因为您将立即丢弃该副本.编译器阻止你编写代码,而代码看起来不像它那样.

一般来说,避免可变结构.他们是邪恶的.在这种情况下,您可以(例如)更改mystruct为不可变,但使用如下方法:

public mystruct WithStruct1(double newValue)
{
    return new mystruct(newValue, struct2);
}
Run Code Online (Sandbox Code Playgroud)

然后将构造函数代码更改为:

My_va = My_va.WithStruct1(10);
Run Code Online (Sandbox Code Playgroud)

...虽然在这种情况下,你应该写的更可能(假设你在构造函数中):

My_va = new mystruct(10, 0);
Run Code Online (Sandbox Code Playgroud)

结构不仅应该是不可变的,它们在大多数代码库中都应该是非常罕见的,IMO.除了Noda Time,我几乎没有编写自己的自定义值类型.

最后,请学习.NET命名约定并尝试遵循它们,即使是示例代码:)

  • 我曾经听过一个烧毁整个村庄的可变结构的故事.Twas疯了. (30认同)
  • @Anthony:你"曾经听过一个故事"吗?你让它听起来像你不相信它.我在那里,看到了一切.它仍然困扰着我. (26认同)
  • Anakin Skywalker很酷,直到他了解到可变结构. (8认同)
  • 我曾经用一把耙子和一大杯水打败了一个可变结构. (7认同)
  • @Marc - 这取决于.grue有耙子和一大杯水吗? (2认同)
  • @Joel:你必须解释一下!昨天晚上我被一个可变结构抢劫了,它偷了我所有的参考资料. (2认同)
  • @Callum Rogers - 我真的不知道怎么做,但是我相信它涉及到水上板,同时用耙子把它钉在地上.当我看到它时,我变得昏昏欲睡. (2认同)
  • @Anthony Pegram-我们每个人都不敢敢编辑Mighty Skeet提交的帖子。 (2认同)

dtb*_*dtb 39

强烈建议避免使用可变结构.他们表现出各种令人惊讶的行为.

解决方案:使您的结构不可变.

public struct MyStruct
{
    public readonly double Value1;
    public readonly decimal Value2;

    public MyStruct(double value1, decimal value2)
    {
        this.Value1 = value1;
        this.Value2 = value2;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

class Test
{
    private MyStruct myStruct;

    public Test()
    {
        myStruct = new MyStruct(10, 42);
    }

    public MyStruct MyStruct
    {
        get { return myStruct; }
        set { myStruct = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)