C# 基本类型(double、int 等)和 Struct 差异

标签 c# properties struct field primitive

我对结构感到困惑。

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/

相关文章:

c - 两个元素相加的数据结构

c - 在 c 中将 malloc 与结构一起使用

c# - 为什么在这个测试中数组比字典快

c# - WPF DataGrid 无法重现 WindowsForms 数据网格大小调整行为

c# - 使用 C# 6 简化条件表达式

java - 是否可以从 application.properties 禁用 Spring Boot 的自动异常处理

Objective-C 属性

java - 如何在属性文件中正确存储和检索国际化字符串?

c - 如何遍历结构数组

c# - 如何从 C# 编写汇编代码?