使用私有属性而不是私有字段有什么区别
private String MyValue { get; set; }
// instead of
private String _myValue;
public void DoSomething()
{
MyValue = "Test";
// Instead of
_myValue = "Test";
}
有任何性能问题吗?还是只是一个命名约定?
使用私有属性而不是私有字段有什么区别
private String MyValue { get; set; }
// instead of
private String _myValue;
public void DoSomething()
{
MyValue = "Test";
// Instead of
_myValue = "Test";
}
有任何性能问题吗?还是只是一个命名约定?
私有属性允许您抽象内部数据,以便对内部表示的更改不需要影响实现的其他部分,即使在同一个类中也是如此。私有字段不提供此优势。使用 C# 3.0 中的自动属性,我很少看到需要直接实现字段——私有或公共。
您可以从属性(私有、公共......)中获得的最大收益是它可以产生计算值与设定值。例如
class Person {
private DateTime _birthday;
private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}
这种模式的优点是只需为 N 个其他值更新一个值以反映更改。无论可访问性如何,属性都是如此。私有财产与非私有财产没有特别的优势(当然,除了它是私有的)
您很少希望将财产设为私有。提供私有财产的规定只是为了完整性。如果您的属性只是获取/设置字段的值,那么不会有性能差异,因为它很可能会被 JIT 编译器内联。
除了已经回答的问题之外,性能、语义和完整性,我见过一个有效的案例,用于私有属性而不是私有字段:
public class Item
{
private Item _parent;
private List<Item> _children;
public void Add(Item child)
{
if (child._parent != null)
{
throw new Exception("Child already has a parent");
}
_children.Add(child);
child._parent=this;
}
}
假设我们不想出于任何原因公开 Parent,但我们可能还想进行验证检查。是否应该能够将父母作为孩子添加到其孩子之一?
要解决此问题,您可以将其设为属性并检查循环引用。
属性访问将(部分)变慢,因为它将调用 getter/setter。好处是您可以进行数据验证,例如,如果您更改要保护的属性,则可以过滤到继承者。
在处理私有访问时,差异非常小。是的,存在性能损失(可能由 JIT 优化)发送属性表示方法调用,而不是直接地址访问。
使用属性的主要优点是允许更改实现而不更改所需的外部签名。由于这些是私人访问的,因此对实现的任何更改只会影响本地代码。
在与私人成员打交道时,除了您团队的约定外,我认为财产没有任何优势。