本地使用私人土地 x 财产的最佳实践
-
08-07-2019 - |
题
当在类内部有一个私有字段并将该字段公开在公共属性上时,我应该在类内部使用哪一个?
下面是我试图找出的示例。应该操纵私有字段_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的这种情况,它更像是个人选择。所以基本上最重要的是,无论你选择什么都是一致的。
那说;我的个人规则倾向于:
-
直接访问您的私人字段。
-
如果访问访问者,请使用关键字ME。提高可读性
-
仅当访问者实现也适用于私有访问的重要逻辑逻辑时才使用访问者。通过这种方式,您知道如果您使用的是访问者,那是因为“还有其他内容”
-
避免使用受保护的字段。派生类应始终使用访问者,永远不要直接访问该字段。
醇>
让我知道你的想法。
旁注:
在此之后,我认为我们缺少类级别字段的新范围。像“Restricted”这样的关键字,此字段只能从其getter / setter访问。这样,您始终可以直接访问私有字段,但是如果您需要确保某个字段只能由其访问者访问,则您将Private更改为Restricted。 (如何“Restricted,RestrictedRead和RestrictedWrite”?)
我更喜欢尽可能使用该物业。这使您可以灵活地修改属性返回/设置的内容,而无需查看所有使用私有变量的位置。
使用私有字段,因为您没有在setter中执行特定操作。
我还建议删除属性设置器,这样就可以强制通过给定方法设置计数器的状态DoSomething()
根据具体情况,最好只允许私有地直接修改类上的字段,或者通过某种将语义与修改相关联的方法。通过这种方式,可以更容易地推断出这个类和特定值,因为您可以确定它仅以某种方式进行修改。此外,在某些时候,诸如递增和int之类的操作可能会产生额外的必要后果,此时通过方法公开对它的访问更有意义。
我总是使用属性访问器,因为如果我将来在getter或setter中添加逻辑,我会很安全,因为我知道没有代码可以绕过它。
如果您担心在直接访问字段时调用属性访问器的性能开销,请不要这样做。大多数编译器都会内联这类内容,为您提供相同的性能。至少,你很可能不需要通过直接进入现场来获得可能获得的额外纳秒时间。
最好坚持使用属性访问器,因为a)您可以在所有代码中保持一致性,使其更易于维护; b)您可以获得其他人指出的好处。
另外,我通常不添加 Me。
(或 this。
)关键字,除非存在范围问题(我试图通过选择我的标识符来避免)小心)。我不会对此感到困惑,因为我的函数和子函数永远不会太长,以至于我不确定我是使用本地(基于堆栈的)变量还是类的成员。当他们太长时间无法轻易讲述时,我会重构。
原始海报完全正确。
1) 直接访问您的私有字段。
- 使重构更加容易。
2) 如果访问访问器使用关键字ME。提高可读性
- 明确列出范围需要读者更少的思考
3) 仅当访问器实现也适用于私有访问的重要逻辑时才使用该访问器。这样您就知道,如果您正在使用访问器,那是因为“还有其他东西”
- 这是违反第一条规则的唯一原因。
4) 避免使用受保护的区域。派生类应始终使用访问器,而不是直接访问字段。