如果有属性,为什么我们需要字段?

时间:2016-01-03 23:49:43

标签: c# .net oop properties

如果属性可以存储数据(如字段那样)为什么我们仍然需要字段

例如我有这个班,

public class Music
{
    public Music() { }
    public float musicBPM { get; set; } 
    public void addBPM()
    {
        this.muscBPM +=10;
    }
}

它仍然有效,因为我有一个私人领域并改变其价值,对吗?

那么,如果您可以使用该属性,那么对于现场的迫切需求是什么?

3 个答案:

答案 0 :(得分:5)

尽管自动属性模糊了这种区别,但是字段和属性之间存在根本区别:

  • 字段是能够存储内容的数据成员,
  • 属性是一种方法或一对方法,通过编译器的帮助,可以像使用它们一样使用它们。

换句话说,当你写

public float musicBPM { get; set; } 

编译器创建如下内容:

private float musicBPM_property;
public float musicBPM {
    get { return musicBPM_property; }
    set { musicBPM_property = value; }
}

当你创建一个自动属性时,该字段仍然存在,但编译器巧妙地将它隐藏起来。

这就是为什么这些字段将继续作为.NET中的概念。但是,C#6的自动只读属性可以消除手动编写的代码中的字段。

答案 1 :(得分:2)

属性仍然需要一个字段作为后备存储库,属性实际上包含两个访问该后备字段的方法(所谓的getter和setter)。

来自msdn

  

属性是一个提供灵活读取机制的成员,   写或计算私有字段的值。属性可以像它们是公共数据成员一样使用,但它们实际上是称为访问器的特殊方法。这样可以轻松访问数据,并且仍然有助于提高方法的安全性和灵活性。

答案 2 :(得分:2)

您不会为您的属性分配值...即使您在一天结束时也会将值分配给变量。

因此,当您说somevar数据实际上被分配给场景后面的名为public int myprop { set { somevar = value; } } 的变量时。

public int myprop {get; set; }

如果您对自动属性感到有点困惑,并且认为您实际上是将值分配给属性,则情况并非如此。在场景编译器后面将创建私有支持字段来保存这些值。

所以,用一句话; properties为您提供了一种封装类字段的方法。

Total