我已经创建这个“问题”作为社区维基,因为没有正确或错误的答案。我只想知道社区对这个具体问题的看法。访问您自己班级的成员:是否使用(自动)属性?
当你有一个实例变量的一类,并且还创建了只是为这些实例变量的getter和setter,你应该使用自己的类中的属性的属性,或者你应该总是使用实例变量?
C#3.0中的自动属性使得这更加困难。
使用属性:
public class MyClass
{
private string _name;
// could be an auto-property of-course
public string Name { get { return _name; } set { _name = value; } }
public void Action()
{
string localVar = Name;
// ...
Name = "someValue";
// ...
}
}
使用实例变量:
public class MyClass
{
private string _name;
public string Name { get { return _name; } set { _name = value; } }
public void Action()
{
string localVar = _name;
// ...
_name = "someValue";
// ...
}
}
(对于那些谁恨成员前缀,我道歉)
就个人而言,我总是用后者(实例变量),因为我觉得属性只能用于其他类,不是你自己。这就是为什么我大多远离汽车性能的原因。
当然,当属性setter(或getter)做的不仅仅是包装实例变量时,事情会改变。
是否有令人信服的理由选择一个或另一个?
-1大多数时候,你需要的那种业务逻辑的类中调用也是如此。所以,基本上,你会主动选择不使用财产的理由。例如如果你知道什么时候最好不要。否则,不会涉及任何开销,因为在非调试screnario中,简单的属性setter/getter无论如何都是内联的。 – 2010-01-22 14:57:07
@Robert Giesecke -1给你评论。验证非空和非空的参数会带来额外的开销。如果没有必要,没有必要这样做,因为这是额外的开销(请重新阅读我的原始响应)。您甚至没有考虑到属性设置器可能需要线程安全(即使用锁定块),在这种情况下,如果您在构造函数中并初始化变量值,则不想调用该属性,因为例。同样,还有其他类型的开销,你似乎没有考虑。 – dcp 2010-01-22 16:54:10