私有类变量的字段与属性

时间:2009-10-09 18:13:48

标签: c# .net properties class

对于私有类变量,首选哪一个?

如果你有int limit这样的属性,你希望它是:

int Limit {get; set;}

并在课堂内使用它,如下所示:

this.Limit

是否有理由使用它或不使用它?可能出于性能原因?

我想知道这是不是一个好习惯。

11 个答案:

答案 0 :(得分:31)

对于私人会员,我只会在获取和/或设置值时将其设为属性,从而导致其他事情发生,例如:

private int Limit
{
   get
   {
       EnsureValue();
       return this._limit;
   }
}

否则,字段很好。如果你需要增加它们的可访问性,它已经是一个足够大的变化,使它在那时成为一个属性并不是一件大事。

编辑:正如斯科特在评论中提醒我们的那样,属性中的副作用通常会导致更多的痛苦。不要违反单一责任并将属性逻辑限制为仅在必须在门口完成的值上的一致逻辑操作 - 例如延迟加载(如示例中所示)上面),将内部结构转换为公共有用的格式等。

答案 1 :(得分:11)

当可访问性为私有时,自动属性对字段的唯一真正好处是您可以在访问和更新变量时设置断点。如果这对您的场景很重要,那么一定要使用自动属性。否则,鉴于没有实质性优势,我选择使用最简单的构造,即场。

答案 2 :(得分:4)

我会说使用房产的良好做法。如果你不得不公开限制值并使用本地成员,那么它将需要更多编码,而如果它是一个属性,它只需要更改其修饰符。

我认为它也更清洁。

答案 3 :(得分:4)

从我的角度来看,使用属性代替变量归结为:

赞成

  • 可以设置调试的断点,正如Jared所说,
  • 可能会造成副作用,例如Rex的EnsureValue()
  • 获取设置可以有不同的访问限制(公共获取,受保护设置),
  • 可以在Property Editors中使用,

缺点

  • 访问速度较慢,使用方法调用。
  • 代码批量,难以阅读(IMO)。
  • 更难以初始化,例如需要EnsureValue();

并非所有这些都适用于int Limit {get; set;}样式属性。

答案 4 :(得分:2)

当然,因为它是一个私有API,它是一个实现细节 - 你可以在这里做任何你想做的事情。但是,即使是私人课程,也没有理由不使用房产。除非有额外的代码,否则JIT会内联这些属性,因此不会对性能产生影响。

偏好房产的最大理由是IMO:

  1. 您的API的一致性 - 您需要公开公开的API中的属性,因此在私有API中创建它们将使您的编程表现更加一致,从而减少由于更好的可维护性而导致的错误
  2. 更容易将私人课程转为公开

答案 5 :(得分:2)

拥有私人或受保护的财产没有任何问题;当存在与基础变量相关的规则或副作用时,这非常有用。

属性对于公共变量看起来更自然的原因在于,在公共情况下,它是一种对冲未来实施变更的赌注的方式,其中财产将保持完整但实施细节以某种方式移动(和/或将需要一些额外的业务规则。)

在性能方面,这对于直接分配属性来说通常是微不足道的,或者确实是相同的。

我个人不喜欢(但经常使用)普通的赋值属性,因为它们只会使代码混乱。我希望C#允许“在重构之后”。

答案 6 :(得分:2)

自动属性的关键是他们可以非常快速地创建对您班级中某些字段的公共访问权限。现在,除了一个大的领域之外,他们没有提供直接暴露于外部世界的好处。

您的课程界面是它与外界沟通的方式。在字段上使用自动属性允许您在路上更改类的内部,以防您需要设置该属性的值,或者在读取时检查授权规则或类似内容。

您已拥有属性这一事实意味着您可以在不破坏公共界面的情况下更改您的实施。

因此,如果这只是一个私有字段,那么自动属性实际上并不是那么有用,不仅仅是这样,而且你不能像声明那样使用字段初始化公共属性。

答案 7 :(得分:2)

我通常遵循以下原则:如果它是严格私人使用,请使用字段,因为它更快。

如果你决定它有一天会成为公共的,受保护的或内部的,那么无论如何都要重构一个属性并不困难,并且使用像ReSharper这样的工具,这需要大约3秒钟......:)

答案 8 :(得分:1)

属性提供了一些非常好的自动功能(如Json和Xml序列化)

字段没有。

属性也可以是接口的一部分。如果您决定稍后进行重构......这也可能需要考虑。

答案 9 :(得分:0)

属性只是语法糖,C#会将它们编译成get_PropertyNameset_PropertyName,因此性能差异不是考虑因素。

答案 10 :(得分:0)

如果您的数据成员只需要设置并获取逻辑,则属性是C#

中非常好且快速的解决方案