在一个文件中我定义了一个公共结构
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命名约定并尝试遵循它们,即使是示例代码:)
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)