Dim*_*Pel 1 c# primitive struct field properties
我对结构感到困惑.
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.
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我能够设置结构a的值,而不是结构的字段b?我读到的答案是我有一份b而不是b的支持字段.按照同样的逻辑,我必须有a的副本,而不是a,所以如何解释a属性在允许的分配后被更改
a = 1.0;
Run Code Online (Sandbox Code Playgroud)
?谢谢.
编辑:
另外为了仍然在A类中使用b,通过set和get方法"过滤"而不是直接使用支持字段_b,这可能是这样的:
MyStruct _b;
MyStruct b { get { return _b; } set { _b=value; } }
Run Code Online (Sandbox Code Playgroud)
然后使用该字段
_b
Run Code Online (Sandbox Code Playgroud)
正如在答案中正确陈述的那样,我想到了一个愚蠢的方法来将属性"包装"在一个大小为1的一维数组中.
MyStruct[] b { get; set; }
Run Code Online (Sandbox Code Playgroud)
用类包装结构.我不知道这个的计算成本,但我更喜欢直接使用A类中的字段.
回答:好的,当你习惯将属性解释为你脑海中的字段时,这个问题就会出现混乱.如果你以正确的方式解释属性 - 就像MsIL那样 - 所有事情都会解决.以下所有答案和评论都是相关的.(抱歉英文不好.)
你做了两件不同的事情.这是两个地方做同样事情的例子:
a = 1.0;
b = new MyStruct(2.0);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,赋值运算符都在调用属性的"setter".您可以将其视为:
this.SetA(1.0);
this.SetB(new MyStruct(2.0));
Run Code Online (Sandbox Code Playgroud)
作为一个更复杂的例子,如果你写道:
a = a + 1.0;
Run Code Online (Sandbox Code Playgroud)
这相当于:
this.SetA(1.0 + this.GetA());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1062 次 |
| 最近记录: |