【问题标题】:Differences between Private Fields and Private Properties私有字段和私有属性的区别
【发布时间】:2010-09-29 11:45:53
【问题描述】:

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

private String MyValue { get; set; }

// instead of

private String _myValue;

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

   // Instead of

   _myValue = "Test";
}

有任何性能问题吗?还是只是一个命名约定?

【问题讨论】:

    标签: c# .net properties


    【解决方案1】:

    您可以从属性(私有、公共...)中获得的最大好处是它可以产生计算值与设定值。例如

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 没有给出这个答案的理由。其他答案解释了为什么私有属性比私有字段更可取。
      【解决方案3】:

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

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

      在与私人成员打交道时,除了您团队的约定之外,我认为财产没有任何优势。

      【讨论】:

        【解决方案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,但我们可能还想进行验证检查。是否应该能够将父母作为孩子添加到其孩子之一?

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 但是,如果您决定它需要除无逻辑的单行 getter 和 setter 之外的其他东西,将字段重构为属性不需要任何成本。
          【解决方案6】:

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

          【讨论】:

          • 这不一定是真的。 JIT'r 通常会内联琐碎的属性。
          猜你喜欢
          • 2014-10-23
          • 2021-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-11
          • 2011-05-15
          • 1970-01-01
          相关资源
          最近更新 更多