C#字段与属性

可能重复:
C#中属性和字段的区别

我认为基本属性( { get; set; } )与公共字段相同,只是能够在不破坏二进制兼容性的情况下更改它们。 按照我的答案https://stackoverflow.com/a/8735303/331785 ,我发现属性也有缺点。 如果它们是值类型,则无法通过引用访问它们。 为什么会这样,还有其他什么差异?

我发现属性也有缺点。 如果它们是值类型,则无法通过引用访问它们。 为什么是这样

因为在封面下,财产只是一种方法。 如果查看IL,您将看到get_PropertyNameset_PropertyName等方法。 问题是为了支持使用引用,您需要能够返回方法的引用。

 public ref T MyProperty { get { return ref _underlyingField; } } 

更新 :从C#7.0开始,可以使用上面描述的语法。

以前答案的剩余部分:

当然, 这在CLR中是完全可能的 ; 但没有被C#语言暴露。

尽管有可能,但CLR需要进行一些调整以保证其可validation性。 该属性的语法必须支持它。

但是, 这有用吗? 如你所说,一个领域可以做到。 如果你需要它; 使用一个字段。 支持它需要做很多工作。 很可能只有少数情况适合; 并且会创建许多情况,首先使用一个字段可能会更好。

属性只是getX()setX()方法的糖涂层语法。 它看起来像一个字段,但它实际上只是两种方法。 添加自动属性的原因是为了避免重复必须创建字段并为属性创建标准的getter和setter,并使更简单的方法允许在不更改接口的情况下更改实现。

如果它们是值类型,则无法通过引用访问它们的原因是因为值类型通常位于堆栈上,并且因为您只是调用方法。 必须调用属性中的getter,并且必须先将返回的值推送到堆栈,然后才能引用它。