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

Yoa*_*. B 36 .net c# properties

使用私有属性而不是私有字段有什么区别

private String MyValue { get; set; }

// instead of

private String _myValue;

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

   // Instead of

   _myValue = "Test";
}
Run Code Online (Sandbox Code Playgroud)

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

tva*_*son 26

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

  • 但是,如果您确定它需要除了无逻辑的一行getter和setter之外的东西,那么将字段重构为属性并不需要花费任何成本. (7认同)

Jar*_*Par 19

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

class Person { 
  private DateTime _birthday;
  private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}
Run Code Online (Sandbox Code Playgroud)

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


Ram*_*der 11

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

  • 没有给出这个答案的理由.其他答案解释了为什么私有财产比私人领域更可取. (2认同)

Jos*_*rke 5

除了已经回答的问题,性能、语义和完整性之外,我还看到了一种针对私有属性而不是私有字段的有效案例:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我们出于某种原因不想公开 Parent,但我们可能还想进行验证检查。父级是否可以作为子级添加到其子级之一?

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