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

下面是我试图找出的示例。应该操纵私有字段_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

结束课程

先谢谢您的帮助。教育

有帮助吗?

解决方案

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

在我的编程经验中,我很少遇到过有用的情况。相反,我更喜欢直接访问字段,并且只有在真正需要时才能通过创建私有访问器来抽象访问,这些访问器可以被公共访问者和其他函数使用。理由是,如果您需要在公共访问器中附加一些特殊逻辑,则内部访问的逻辑可能不同。

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

其他提示

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

发生这种情况的一个很好的例子是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。

谢谢大家的答案和建议。

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

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

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

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

  3. 仅当访问者实现也适用于私有访问的重要逻辑逻辑时才使用访问者。通过这种方式,您知道如果您使用的是访问者,那是因为“还有其他内容”

  4. 避免使用受保护的字段。派生类应始终使用访问者,永远不要直接访问该字段。

  5. 让我知道你的想法。

    旁注:

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

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

使用私有字段,因为您没有在setter中执行特定操作。

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

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

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

如果您担心在直接访问字段时调用属性访问器的性能开销,请不要这样做。大多数编译器都会内联这类内容,为您提供相同的性能。至少,你很可能不需要通过直接进入现场来获得可能获得的额外纳秒时间。

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

另外,我通常不添加 Me。(或 this。)关键字,除非存在范围问题(我试图通过选择我的标识符来避免)小心)。我不会对此感到困惑,因为我的函数和子函数永远不会太长,以至于我不确定我是使用本地(基于堆栈的)变量还是类的成员。当他们太长时间无法轻易讲述时,我会重构。

原始海报完全正确。

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

  • 使重构更加容易。

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

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

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

  • 这是违反第一条规则的唯一原因。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top