C#3.0+中属性和字段的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

一旦我知道了

  • 我不会使用我的课程“仅适用于属性的技巧”
  • 我不会在getter / setter中使用验证码。

是否有任何区别(除了风格/未来的发展),就像设置属性的某种控制类型一样?

是否有任何其他区别:

public string MyString { get; set; }

public string myString;
提问于
用户回答回答于

封装。

在第二个例子中,你刚刚定义了一个变量,第一个变量周围有一个getter / setter。因此,如果你决定要在以后的日期验证变量,那将会容易得多。

另外它们在Intellisense中显示方式不同

用户回答回答于

字段和属性看起来相同,但它们不是。属性是方法,因此有些属性不支持某些事情,有些属性可能会发生,但从不属于字段。

以下是差异清单:

  • 字段可以用作out/ref参数的输入。属性不能。
  • 一个字段在多次调用时总是会产生相同的结果(如果我们忽略了多个线程的问题)。一个属性DateTime.Now并不总是等于它自己。
  • 属性可能会抛出异常 - 字段永远不会这样做。
  • 属性可能有副作用或需要很长时间才能执行。田地没有副作用,并且将始终如预期的那样快。
  • 属性支持getters / setters的不同可访问性 - 字段不支持(但可以创建字段readonly
  • 当使用反射的属性和字段将被视为不同的MemberTypes,以便它们位于不同的(GetFieldsVS GetProperties例如)
  • 与现场访问相比,JIT编译器可能会以不同的方式处理财产访问。然而,它可能会编译成相同的本地代码,但差异的范围在那里。

扫码关注云+社区