【问题标题】:What is the best way to access properties from the same class, via accessors or directly? [closed]通过访问器或直接访问同一类的属性的最佳方法是什么? [关闭]
【发布时间】:2010-09-26 05:28:42
【问题描述】:

这是我不太一致的事情,并且总是对其他人的所作所为感到好奇。

您如何访问内部属性(私有或公共)?

例如你有这个属性:

Private _Name As String

Public Property Name() As String
    Get
        Return _Name
    End Get
    Set(ByVal value As String)
        _Name = value
    End Set
End Property

在另一个函数的同一个类中,你更喜欢哪一个?为什么?

_Name = "Johnny"

Name = "Johnny"

忽略我使用 Name 而不是 Me.Name 的事实。

【问题讨论】:

标签: .net class properties oop accessor


【解决方案1】:

使用属性(名称)。我认为属性应该是基础字段(_name)的唯一“所有者”。

在属性下封装字段的优点:

  • 可读性:只有一个代码区域在返回之前更改或处理了 _name。
  • 易于设置断点、调试等。
  • DRY:就验证和处理而言,没有代码重复。
  • 更改弹性:更改验证和处理不会影响代码使用 财产。

【讨论】:

    【解决方案2】:

    这很有趣,我想大多数人都在做我所做的事情

    Me.Name = "Johnny"
    

    Name = "Johnny"
    

    但是我见过的大多数项目都在使用

    _Name = "Jonny"
    

    风格。我认为这是一个坏主意,并且感谢您确认的答案。甚至大多数由多种工具自动生成的代码都使用直接访问。

    有什么特别的性能影响吗?或者是编译器在set或get中没有额外代码时对其进行优化。

    【讨论】:

    • 当不在调试器中运行时,JIT 将内联琐碎的属性。
    • 干杯乔恩,(很遗憾我不能投票给这个答案:))
    • 我投票并接受了原来的那个。
    【解决方案3】:

    我会说

    Name = "Johnny"
    

    原因是我可能有一些验证(或触发器,或延迟初始化,或...),或者稍后可能决定在分配名称时插入一些验证,并且我想确保触发该代码。

    【讨论】:

      【解决方案4】:

      我个人更喜欢尽可能使用该属性。这意味着您仍然可以获得验证,并且您可以轻松地在属性访问上设置断点。当您尝试更改两个相互验证的属性时,此不起作用 - 例如,“最小和最大”对,其中每个属性都有一个验证约束,例如 @ 987654322@ 在任何时候。你可能有(C#):

      public void SetMinMax(int min, int max)
      {
          if (max > min)
          {
              throw new ArgumentOutOfRangeException("max";
          }
          // We're okay now - no need to validate, so go straight to fields
          this.min = min;
          this.max = max;
      }
      

      在未来的某个时候,我希望 C# 能够在属性中声明支持字段,这样它对 只是属性是私有的:

      public string Name
      {
          string name;
      
          get { return name; }
          set
          {
              if (value == null)
              {
                  throw new ArgumentNullException("value");
              }    
              name = value;
          }
      }
      

      在酒店外,您根本无法访问name,只能访问Name。我们已经为自动实现的属性提供了这个,但它们不能包含任何逻辑。

      【讨论】:

      【解决方案5】:

      我更喜欢:

      Name = "Johny"
      

      对我来说,原因很简单,如果 _Name 发生了不好的事情,你总是可以在 getter/setter 中输入一些输出,找出导致问题的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 2013-06-03
        • 2020-07-04
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        相关资源
        最近更新 更多