我对结构感到困惑。
class A
{
double a { get; set; }
MyStruct b { get; set; }
void Modify()
{
a = 1.0; // This compiles.
b.c = 2.0; // Assuming c is a double. This gives the known error.
}
}
现在为什么我可以设置结构 a 的值,而不是结构字段 b 的值? 我读到的答案是我有一份 b 而不是 b 的支持字段。按照同样的逻辑,我必须有一个 a 的副本,而不是 a,所以它如何解释 a 属性在允许的赋值之后被更改
a = 1.0;
?谢谢。
编辑:
此外,为了仍然在 A 类中使用 b,通过 set 和 get 方法“过滤”而不是直接通过使用支持字段 _b,它可能看起来像这样:
MyStruct _b;
MyStruct b { get { return _b; } set { _b=value; } }
然后使用字段
_b
,正如答案中正确指出的那样,我想到了一种将属性“包装”在大小为 1 的一维数组中的愚蠢方法。
MyStruct[] b { get; set; }
有点用类包装结构。我不知道这样做的计算成本,但我更喜欢直接在 A 类中使用该字段。
已回答:好的,当您在脑海中习惯于将属性解释为字段时,这个问题就会出现混淆。如果您以正确的方式解释属性 -如 MsIL 所做的那样-,一切都会安定下来。下面的所有答案和评论都是相关的。 (抱歉英语不好。)
最佳答案
你在做两件不同的事情。这是在两个地方做相同事情的例子:
a = 1.0;
b = new MyStruct(2.0);
在这两种情况下,赋值运算符都在调用属性的“setter”。您可以将其视为:
this.SetA(1.0);
this.SetB(new MyStruct(2.0));
作为一个更复杂的例子,如果你写:
a = a + 1.0;
相当于:
this.SetA(1.0 + this.GetA());
关于C# 基本类型(double、int 等)和 Struct 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4736247/