【问题标题】:Using the value from the private variable or from the actual property in class functions?使用来自私有变量的值还是来自类函数中的实际属性的值?
【发布时间】:2009-12-30 20:35:25
【问题描述】:

当从类中的函数引用类属性时,您是使用实际属性的值还是私有变量的值?

哪种方式最好?为什么?

public class

  private m_Foo as double

  public property Foo() as double
    get
      return m_Foo
    end get
    set(byval value as double)
      m_Foo = value
    end set
  end property

  public function bar() as double
    Dim x as double = 5 * m_Foo
    Dim y as double = 3 * Foo
  end function

end class

【问题讨论】:

    标签: c# .net vb.net class properties


    【解决方案1】:

    就我个人而言,我尽可能使用 get/set 访问器,以避免在我更改其逻辑时让我自己感到惊讶,而我访问私有字段的地方突然无法按预期工作。

    【讨论】:

      【解决方案2】:

      属性代码可能包含——现在或将来——根据对象状态返回不同值或设置不同值的逻辑。使用该属性是有意义的。

      【讨论】:

      • 而且,如果你有使用自动属性的习惯,你别无选择。
      【解决方案3】:

      我更喜欢后者。如果您的属性只是返回该字段,编译器将优化您对它的调用。你需要像其他人一样保护自己免受自己的变化。如果该属性稍后在返回之前对该字段进行了某些操作,那么您必须更新所有内部代码以适应它。

      【讨论】:

      • +1 用于提及内联优化。当你考虑到这一点时,问题真的变成了“你为什么不使用该物业?” (除了使用 ref 参数的明显情况)
      【解决方案4】:

      使用该属性可能更安全(但不是更好),以防您稍后添加额外的get 逻辑。当然,将逻辑添加到 get 以处理昨天才属于“普通”属性的东西可能不是一个好主意。

      【讨论】:

      • 正是我的想法。改变属性的行为可能是个坏主意,这当然会带来另一个问题,属性中应该包含多少逻辑?
      • 更改可能发生在重构过程中、原型制作过程中、生产前的任何阶段。
      【解决方案5】:

      两件事。

      首先,这是一个副本

      When should a class use its own getters/setters vs accessing the members directly?

      其次,这是我今年早些时候关于一个密切相关主题的文章:

      http://blogs.msdn.com/ericlippert/archive/2009/01/14/automatic-vs-explicit-properties.aspx

      【讨论】:

        【解决方案6】:

        属性通常包含简单的逻辑,直接访问变量可能会错过。

        public class MyClass 
        {
        
           private List<string> _someList;
        
           public List<string> SomeString
           {
              get
              {
                 if(_someList == null)
                    _someList = new List<string>();
                 return _someList;
              }
           }
        
        }
        

        如果您随后直接访问_someList,您可能会遇到空引用。直接访问该属性可确保它已被初始化。

        有些人可能会争辩说,私有变量应该首先被简单地声明为 new,或者在构造函数而不是属性中初始化 - 但这至少应该突出一个可能的问题,因为这是一种常见的方法。

        【讨论】:

          猜你喜欢
          • 2016-11-05
          • 2019-05-09
          • 2015-10-30
          • 1970-01-01
          • 2012-07-06
          • 1970-01-01
          • 2017-08-21
          • 1970-01-01
          • 2021-12-22
          相关资源
          最近更新 更多