C#原始类型(double,int等)和Struct差异

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那样 - 所有事情都会解决.以下所有答案和评论都是相关的.(抱歉英文不好.)

Jon*_*eet 5

你做了两件不同的事情.这是两个地方做同样事情的例子:

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)