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

C# 私有字段和私有属性之间的差异,c#,.net,properties,C#,.net,Properties,使用私有属性而不是私有字段有什么区别 private String MyValue { get; set; } // instead of private String _myValue; public void DoSomething() { MyValue = "Test"; // Instead of _myValue = "Test"; } 是否存在任何性能问题?或者只是一个命名约定?属性访问将(稍微)慢一些,因为它将调用getter/setter。这样做的

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

private String MyValue { get; set; }

// instead of

private String _myValue;

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

   // Instead of

   _myValue = "Test";
}

是否存在任何性能问题?或者只是一个命名约定?

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

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

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

除了已经回答的问题、性能、符号和完整性之外,我还看到了一个关于私有属性而不是私有字段的有效案例:

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;
    }
}
公共类项目
{
私人物品(家长);;
私人名单——儿童;
公共无效添加(项目子项)
{
if(子项。\u父项!=null)
{
抛出新异常(“子项已经有父项”);
}
_添加(child);
child.\u parent=this;
}
}
假设我们不想出于任何原因公开父级,但我们可能还想进行验证检查。父母是否可以作为子女添加到其子女中


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

您可以从属性(私有、公共等)中获得的最大收益是,它可以生成一个计算值,而不是一个设定值。比如说

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

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

在处理私有访问时,差异非常小。是的,存在性能影响(可能会通过JIT进行优化)发送属性表示方法调用,而不是直接地址访问

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


在与私人成员打交道时,我看不到从财产中获得任何好处,除了您团队的惯例。

这不一定是真的。JIT'r通常会内联一些无关紧要的属性。但是,如果您决定将一个字段重构为一个属性,而不是需要无逻辑的单行getter和setter,则不需要花费任何成本。没有给出这个答案的理由。其他答案解释了为什么私有属性比私有字段更可取。