【问题标题】:What is the best way to access properties from the same class, via accessors or directly? [closed]通过访问器或直接访问同一类的属性的最佳方法是什么? [关闭]
【发布时间】:2010-09-26 05:28:42
【问题描述】:
这是我不太一致的事情,并且总是对其他人的所作所为感到好奇。
您如何访问内部属性(私有或公共)?
例如你有这个属性:
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 的事实。
【问题讨论】:
标签:
.net
class
properties
oop
accessor
【解决方案1】:
使用属性(名称)。我认为属性应该是基础字段(_name)的唯一“所有者”。
在属性下封装字段的优点:
- 可读性:只有一个代码区域在返回之前更改或处理了 _name。
- 易于设置断点、调试等。
- DRY:就验证和处理而言,没有代码重复。
- 更改弹性:更改验证和处理不会影响代码使用
财产。
【解决方案2】:
这很有趣,我想大多数人都在做我所做的事情
Me.Name = "Johnny"
或
Name = "Johnny"
但是我见过的大多数项目都在使用
_Name = "Jonny"
风格。我认为这是一个坏主意,并且感谢您确认的答案。甚至大多数由多种工具自动生成的代码都使用直接访问。
有什么特别的性能影响吗?或者是编译器在set或get中没有额外代码时对其进行优化。
【解决方案3】:
我会说
Name = "Johnny"
原因是我可能有一些验证(或触发器,或延迟初始化,或...),或者稍后可能决定在分配名称时插入一些验证,并且我想确保触发该代码。
【解决方案4】:
我个人更喜欢尽可能使用该属性。这意味着您仍然可以获得验证,并且您可以轻松地在属性访问上设置断点。当您尝试更改两个相互验证的属性时,此不起作用 - 例如,“最小和最大”对,其中每个属性都有一个验证约束,例如 @ 987654322@ 在任何时候。你可能有(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。我们已经为自动实现的属性提供了这个,但它们不能包含任何逻辑。
【解决方案5】:
我更喜欢:
Name = "Johny"
对我来说,原因很简单,如果 _Name 发生了不好的事情,你总是可以在 getter/setter 中输入一些输出,找出导致问题的原因。