可能重复:
C#中属性和字段的区别
我以为基本属性({ get; set; }
)与公共字段相同,只是能够在不破坏二进制兼容性的情况下更改它们。根据我在这里得到的答案https://dev59.com/I2oy5IYBdhLWcg3wKq4S#8735303,我发现属性也有一个缺点。如果它们是值类型,则无法通过引用访问它们。为什么会这样,还有哪些区别?
可能重复:
C#中属性和字段的区别
我以为基本属性({ get; set; }
)与公共字段相同,只是能够在不破坏二进制兼容性的情况下更改它们。根据我在这里得到的答案https://dev59.com/I2oy5IYBdhLWcg3wKq4S#8735303,我发现属性也有一个缺点。如果它们是值类型,则无法通过引用访问它们。为什么会这样,还有哪些区别?
get_PropertyName
和 set_PropertyName
这样的方法。问题在于,为了支持使用引用工作,您需要能够返回方法的引用。public ref T MyProperty
{
get
{
return ref _underlyingField;
}
}
更新: 从C# 7.0开始,可以使用上述描述的语法实现此操作。
之前的答案剩余部分:
当然,在CLR中是完全可能的;但不是由C#语言公开的。
虽然这是可能的,但CLR需要进行一些调整才能保持可验证性。该属性的语法也必须支持它。
然而,这有用吗? 正如您所说,一个字段可以做到这一点。如果需要,请使用字段。支持它需要大量的工作。可能只有极少数情况是适当的,而在第一次使用字段可能更好。
属性只是对getX()
和setX()
方法语法的简单封装。它看起来和行为类似于字段,但实际上只是两个方法。引入自动属性的原因是为了避免重复创建字段并且为该属性创建标准getter和setter,并使得更改实现而不更改接口变得更加简单。
如果它们是值类型,则无法通过引用进行访问的原因是值类型通常在堆栈上,因为你只是调用方法。必须调用属性中的getter并将返回的值推送到堆栈上才能被引用。
ref
或out
关键字进行引用传递。 - diggingforfire