C#字段与属性

时间:2012-01-07 21:15:10

标签: c# properties

  

可能重复:
  Difference between Property and Field in C#

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

2 个答案:

答案 0 :(得分:14)

  

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

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

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

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

以前回答的剩余部分:

这当然是something entirely possible in the CLR;但不是用C#语言公开的。

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

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

答案 1 :(得分:4)

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

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