私有字段和私有属性之间的差异

时间:2009-01-04 14:26:27

标签: c# .net properties

使用私有属性而不是私有字段

有什么区别
private String MyValue { get; set; }

// instead of

private String _myValue;

public void DoSomething()
{
   MyValue = "Test";

   // Instead of

   _myValue = "Test";
}

有任何性能问题吗?或只是一个命名惯例?

6 个答案:

答案 0 :(得分:26)

私有属性允许您抽象内部数据,以便对内部表示的更改不需要影响实现的其他部分,即使在同一个类中也是如此。私人领域不提供这种优势。使用C#3.0中的自动属性,我很少看到需要直接实现字段 - 私有或公共。

答案 1 :(得分:19)

您可以从财产(私人,公共......)获得的巨大收益是它可以产生计算值与设定值。例如

class Person { 
  private DateTime _birthday;
  private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}

此模式的优点是,必须为N个其他值更新一个值才能反映更改。无论可访问性如何,属性都是如此。私有财产与非私有财产(当然不是私有财产)没有特定的优势

答案 2 :(得分:11)

你很少想要私有财产。提供私人财产只是为了完整起见。如果您的属性只是获取/设置字段的值,那么没有性能差异,因为它很可能由JIT编译器内联。

答案 3 :(得分:4)

除了已经回答的内容,性能,语法和完整性有一个我见过的私有属性而非私有字段的有效案例:

public class Item
{
    private Item _parent;
    private List<Item> _children;

    public void Add(Item child)
    {
        if (child._parent != null)
        {
            throw new Exception("Child already has a parent");
        }
        _children.Add(child);
        child._parent=this;
    }
}

假设我们不想因任何原因公开Parent,但我们可能也想进行验证检查。父母是否应该作为孩子加入其中一个孩子?

要解决此问题,您可以将其设为属性并执行循环引用检查。

答案 4 :(得分:0)

属性访问将(稍微)慢,因为它将调用getter / setter。好处是您可以进行数据验证,例如,如果您更改要保护的属性,则可以过滤为继承者。

答案 5 :(得分:0)

在处理私人访问时,差异非常小。是的,有性能损失(可能由JIT优化)发送属性代表方法调用,而不是直接地址访问。

使用属性的主要优点是允许在不更改所需的外部签名的情况下更改实现。由于这些是私有访问的,因此对实现的任何更改都只会影响本地代码。

在与私人会员打交道时,除了你团队的惯例外,我认为没有从属性中获得任何好处。