2010-04-13 65 views
10

我检讨其他开发人员的代码,他已经写了很多的类级变量的代码类似于以下内容:用getter和setter声明一个私有属性有什么好处吗?

/// <summary> 
    /// how often to check for messages 
    /// </summary> 
    private int CheckForMessagesMilliSeconds { get; set; } 

    /// <summary> 
    /// application path 
    /// </summary> 
    private string AppPath { get; set; } 

不编码这种方式增加了不必要的开销,因为变量是私有的?

难道我不考虑在需要的私有变量编码的这种模式的情况?

+0

我更喜欢使用私有字段而不是私有属性,因为我的代码中存在的_前缀提醒我我正在使用私有成员。如果以后我想让它们成为私有属性,我只会让Resharper做它的事情,因为无论如何,所有引用都是本地的。 – 2010-04-13 19:51:43

+0

[私有字段和私有属性之间的差异]的可能重复(http://stackoverflow.com/questions/411048/differences-between-private-fields-and-private-properties) – 2012-04-19 01:02:19

回答

6

专用属性时指派的值该专用变量(其是由编译器为您创建)为您提供一个抽象层。这样做的效率并不低,如果您需要改变未来完成任务的方式,您只需要担心在一个地方更新它。

它还可以在应用程序中提供一致性。如果所有分配都是通过属性完成的,那么一些可以验证分配值,而另一些则不能。对于与财产接口的人来说,验证和验证者之间没有区别。 (和这样某人不小心将值分配给一个局部变量,其不验证。)

+0

大部分时间JIT编译器将优化对吸气和呼吸者的呼叫消失了,所以我不会太在意效率。 – Steven 2010-04-13 18:48:29

1

IIRC,编译器将优化访问的属性和它最终将是到自动直接引用生成后台字段。

这将导致没有开销,清洁和更可维护的代码。

+2

这将是JIT编译器,而不是C#编译器。 – 2010-04-13 17:50:51

9

这就像说私有方法不是有益的,因为他们增加不必要的开销和类外没有人会使用它们。

属性给你一个变量,你的代码的其余部分之间的联系点。将来,您可能需要添加错误检查或更新其他值,只要变量发生变化,属性将允许您这样做。

+0

+1:此模式有一个名称:**自封装字段**。当强制执行与字段相关的规则或不变量时,它会变得重复,否则会重复并分散。这里有一篇很棒的文章:http://sourcemaking.com/refactoring/self-encapsulate-field – LBushkin 2010-04-13 18:02:55

3

没有,JIT编译器将其转换属性访问到直接变量访问的支持字段,所以一点也不比直接使用一个成员变量效率较低。

优点是,如果您希望将属性转换为非平凡实现,您可以将代码添加到get/set中,以允许其他检查或行为或不同的存储机制用于属性,而无需重构任何客户端代码(在这种情况下,全部在同一个类中)。

3

我认为这是一个很好的做法,习惯于使用属性而不是字段。
由于JIT可以内联getter和setter,所以开销可能最小。所以虽然不一定要求,但这样做没有任何问题。

0

性能问题可能是微不足道或根本不存在的,但它需要你输入9个字符(+空格)没有收获。如果您以后想要将字段转换为属性,则无论如何都可以这样做,因为字段和属性是完全源兼容的(只要您不使用可变值类型)。

0

我没有看到任何真正的好处,但我也没有看到任何伤害。如果您将来将该物业转为公共物品,可能会为您节省一些打字费用。但是,您将私人会员转换为公共财产的频率如何?而当你这样做的时候,它可能只是一两个项目,但是你的课程中包含很多成员。如果您要转换为不重要的实现或添加任何类型的验证,则需要将自动执行属性转换为具有实际后备字段的属性,否则您可能会认为自己在开始。

对我来说,这似乎是个人喜好的事情,没有性能影响,以及在进行未来更改时会产生一些次要影响(积极和消极)。

相关问题