2

当在一个类中你有一个私有字段并在公共属性上公开该字段时,我应该在类中使用哪个字段?

下面是我试图找出的一个例子。应该操纵 Private Field _Counter 还是 Property Counter?

公开课测试

Private _Counter As Integer

Public Property Counter() As Integer
    Get
        Return _Counter
    End Get
    Set(ByVal value As Integer)
        _Counter = value
    End Set
End Property

Private Sub Dosomething()

    'What is the best practice?
    'Direct access to private field or property?

    'On SET
    _Counter += 1
    'OR
    Me.Counter += 1

    'On Get
    Console.WriteLine(_Counter)
    Console.WriteLine(Me.Counter)

End Sub

结束类

在此先感谢您的帮助。教育

4

9 回答 9

5

IMO 您应该尽可能使用属性访问器。这是因为您不必担心拥有 a 属性时可能可用的任何内部逻辑。

发生这种情况的一个很好的例子是在 Linq DataContext 后面的代码中。

看一下这个...

[Column(Storage="_ReviewType", DbType="TinyInt NOT NULL")]
public byte ReviewType
{
    get
    {
        return this._ReviewType;
    }
    set
    {
        if ((this._ReviewType != value))
        {
            this.OnReviewTypeChanging(value);
            this.SendPropertyChanging();
            this._ReviewType = value;
            this.SendPropertyChanged("ReviewType");
            this.OnReviewTypeChanged();
        }
    }
}

注意到“setter”中的所有逻辑了吗?

这就是为什么开始练习调用属性而不是字段的做法很重要,IMO。

于 2009-05-07T06:02:38.147 回答
2

谢谢大家的回答和建议。

在考虑了这里的所有建议以及其他研究之后,我的印象是,对于 Private Field 与 Assessor 的这种情况,它更多是个人选择。所以基本上最重要的是无论你选择什么都要保持一致。

那就是说;我个人的规则倾向于这个:

  1. 直接访问您的私有字段。

  2. 如果访问访问器使用关键字 ME。提高可读性

  3. 仅当访问器实现了也适用于私有访问的重要逻辑逻辑时才使用访问器。这样你就知道如果你正在使用访问器,那是因为“它还有其他东西”

  4. 避免使用受保护的字段。派生类应该始终使用访问器,而不是直接访问该字段。

让我知道你的想法。

边注:

在此之后,我认为我们缺少类级别字段的新范围。像“Restricted”这样的关键字,该字段只能从其 getter/setter 访问。这样,您始终可以直接访问私有字段,但如果您需要确保某个字段只能由其访问者访问,您可以将 Private 更改为 Restricted。(“Restricted、RestrictedRead 和 RestrictedWrite”怎么样?)

于 2009-05-08T04:07:34.420 回答
1

在我看来,在内部使用公共访问器是过度封装:它模糊了代码。使用这种方法,否则简单的操作会调用可能包含更复杂逻辑的访问器,因此更难分析操作的代码。

在我的编程经验中,我很少遇到它会有很大帮助的情况。相反,我更喜欢直接访问字段,并且仅在确实需要时,通过创建私有访问器来抽象访问,公共访问器和其他功能都可以使用该访问器。基本原理是,如果您需要在公共访问器中附加一些特殊逻辑,则很可能逻辑可能与内部访问不同。

另请注意,大多数现代 IDE(如 Eclipse)允许立即查看对私有字段的所有引用,并重构代码以使用函数而不是直接访问。

于 2009-05-07T06:25:22.740 回答
0

我更喜欢尽可能使用该物业。这使您将来可以灵活地修改属性返回/设置的内容,而无需遍历并找到所有使用私有变量的位置。

于 2009-05-07T05:51:11.917 回答
0

使用私有字段,因为您没有在 setter 中做特定的事情。

我还建议删除属性设置器,这样你就可以强制计数器的状态由给定的方法 DoSomething() 设置

于 2009-05-07T05:59:14.270 回答
0

根据情况,最好只允许私下直接修改类上的字段,或者通过将语义与修改相关联的某种方法。这样就更容易推理这个类和那个特定的值,因为你可以确定它只是以某种方式修改的。此外,在某些时候,诸如递增和 int 之类的操作可能会产生额外的必要后果,此时通过方法公开对它的访问更有意义。

于 2009-05-07T06:01:04.517 回答
0

总是使用属性访问器,因为如果我将来在 getter 或 setter 中添加逻辑,我是安全的,我确信没有代码会绕过它。

于 2009-05-07T06:10:36.927 回答
0

如果您担心直接访问字段时调用属性访问器的性能开销,请不要。大多数编译器都会内联这种东西,从而有效地为您提供相同的性能。至少,您不太可能需要通过直接前往现场获得的额外纳秒时间

最好坚持使用属性访问器,因为a)您可以在所有代码中保持一致,这使得它更易于维护;b)您可以获得其他人在这里指出的好处。

此外,我通常不添加Me.(or this.) 关键字,除非存在范围问题(我通过仔细选择标识符来尝试避免)。我不会对此感到困惑,因为我的函数和子函数从来没有那么长,以至于我不确定我是在使用本地(基于堆栈的)变量还是类的成员。当它们太长而无法轻易分辨时,我会重构。

于 2009-05-07T06:21:59.440 回答
0

原始海报完全正确。

1)直接访问您的私人领域。

  • 使重构更容易。

2) 如果访问访问器使用关键字 ME。提高可读性

  • 明确列出范围需要读者更少的思考

3) 仅当访问器实现了也适用于私有访问的重要逻辑逻辑时才使用访问器。这样你就知道如果你在使用访问器,那是因为“它有其他东西”</p>

  • 这是违反规则 #1 的唯一原因。

4) 避免使用受保护的字段。派生类应该始终使用访问器,而不是直接访问该字段。

于 2009-07-10T11:58:36.650 回答