如果我的类有一个存储私有字段的属性,我应该使用私有字段还是属性在构造函数中初始化它?
以下哪两项比较好?为什么?例子:
Ex。 1:如果我的类有一个存储私有字段的属性,我应该使用私有字段还是属性在构造函数中初始化它?
public class TestClass
{
public TestClass(CoolClass cool)
{
this.Cool = cool;
}
CoolClass _cool
public CoolClass Cool
{
get
{
return _cool;
}
set
{
_cool = value;
}
}
}
Ex。 2:
public class TestClass
{
public TestClass(CoolClass cool)
{
_cool = cool;
}
CoolClass _cool
public CoolClass Cool
{
get
{
return _cool;
}
set
{
_cool = value;
}
}
}
(我知道,人们可以简单地做public CoolClass { get; set; }
,但让我们忽略了秒),我想这只是归结为:从一个类中,应在使用其属性或其相应获取/设置值的字段?编辑:非常感谢您的回复。看起来有很多相互矛盾的观点。所以这里是我决定的,让我知道你的想法: 我会尽可能使用属性;只有当有副作用时,我才会使用另一种访问方式。
为什么?
- 我喜欢只从一个地方访问变量的想法。
- 我可以轻松地将逻辑集成到变量访问中。
- 我经常使用public CoolClass { get; set; }
,所以尽可能使用属性更一致。
而且我注意到,很遗憾,这是不可能申报财产有几个getter/setter方法具有不同的可视性修饰符 - 这本来是很高兴有一个私人二传手以及公众一个...
答案是,这取决于。在风格方面,我觉得设置属性更好。这样,你的私有变量只能在一个地方被触及,如果未来的逻辑变化,你需要调用该属性,你已经为此做好了准备。但那只是我个人的偏好。你需要考虑是否设置属性的一个地方是,如果你有某种副作用 - 当其他一些变量或属性发生变化或事件根据你在其他属性中设置的值触发。
另一方面,你经常会有成员变量,你不会暴露给外部世界。除非你管理setter副作用或getter计算,否则为这些设置私有getter/setter可能不值得。选择较容易阅读的地方。性能可以忽略不计。风格和预测未来的变化是你考虑这是你必须维护的代码的一切。
您应尽可能在内部使用该属性 - 您最终可能会使用其他逻辑或事件来扩展属性设置器。你一般都希望这些在每次更新时都会触发;访问字段而不是属性绕过这些导致不一致的地方。
如果你用某个属性包装了一个私有变量的访问权限,则应该始终通过该属性访问它。这样,如果您最终在您的get
或set
中执行更多工作(验证或其他逻辑),那么您直接访问该字段时无需进行相同的检查。仅仅因为你可以在不使用公共财产的情况下访问该领域并不意味着你应该这样做。
基本上,为了让您访问限于单个输入/输出的字段,请始终使用该属性,因为它是为此目的而定义的。
我personnaly更喜欢使用私有变量作为使用该属性可以经常有其他后果,你可能不希望发生;例如一个PropertyChangedNotifyer事件,但是如果没有这些,它并没有真正发挥很大的不同,它归结于优先级。
除非有特定的需要绕过属性setter的任何逻辑,否则使用属性而不是直接访问该字段。使用通用代码路径应该有助于可维护性和代码可预测性。结果不应该根据您是使用属性实例化对象还是将其设置在事实之后而变化。
我认为你可以在这种情况下争论双方。我通常直接使用该字段 - 我认为这样更清楚一点,我只是分配值而不做任何其他验证/处理。话虽如此,我的大部分课程都是不变的,所以这是唯一的方法。
另一方面,你可能会争辩说,当setter被定义时,你应该在任何地方使用它来保持字段和使用它的代码之间的间接级别,以便当你引入一些验证/处理二传手你的代码将是一致的。
请参阅[本地使用私有字段x属性的最佳实践](http://stackoverflow.com/questions/833047/best-practice-on-local-use-of-private-field-x-property) – 2010-07-13 10:43:25