从同一个类,通过访问器或直接访问属性的最佳方法是什么?

时间:2008-12-10 11:39:51

标签: .net class properties oop accessor

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

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

例如,你有这个属性:

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。

的事实

5 个答案:

答案 0 :(得分:12)

就个人而言,我更愿意尽可能使用该物业。这意味着您仍然可以获得验证,并且您可以轻松地在属性访问上添加断点。当您试图对两个相互验证的属性进行更改时,工作 - 例如,“min和max”对,其中每个属性都有一个验证约束,使{始终{1}}。你可能有(C#):

min <= max

在将来的某个时候,我希望看到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;
}

在酒店外,您根本无法public string Name { string name; get { return name; } set { if (value == null) { throw new ArgumentNullException("value"); } name = value; } } name。我们已经将其用于自动实现的属性,但它们不能包含任何逻辑。

答案 1 :(得分:2)

我会说

Name = "Johnny"

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

答案 2 :(得分:1)

我更喜欢:

Name = "Johny"

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

答案 3 :(得分:0)

这很有意思,我想大部分人都在做我做的事情

Me.Name = "Johnny"

Name = "Johnny"

然而,我见过的大部分项目都是

_Name = "Jonny"

式。我认为这是一个坏主意,并且由于答案你确认了它。即使是多个工具生成的大多数自动代码都使用直接访问。

是否有任何特定的性能影响?或者,如果set或get中没有额外的代码,编译器会对其进行优化。

答案 4 :(得分:0)

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

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

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