4

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

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

例如你有这个属性:

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 的事实。

4

5 回答 5

12

就个人而言,我更喜欢尽可能使用该物业。这意味着您仍然可以获得验证,并且您可以轻松地在属性访问上设置断点。这在您尝试更改相互验证的两个属性时不起作用 - 例如,“最小和最大”对,其中每个属性始终都有一个验证约束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;
}

在未来的某个时候,我希望看到 C# 能够在属性中声明支持字段,使其仅对属性私有:

public string Name
{
    string name;

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

在财产之外,您根本无法获得name,只有Name。我们已经为自动实现的属性提供了这个,但它们不能包含任何逻辑。

于 2008-12-10T11:45:59.590 回答
2

我会说

Name = "Johnny"

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

于 2008-12-10T11:46:08.857 回答
1

我更喜欢:

Name = "Johny"

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

于 2008-12-10T11:44:19.783 回答
0

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

Me.Name = "Johnny"

或者

Name = "Johnny"

然而,我见过的大多数项目都在使用

_Name = "Jonny"

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

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

于 2008-12-10T12:06:33.717 回答
0

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

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

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