私有类变量的字段与属性

对于私有类变量,哪一个更受欢迎?

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

 int Limit {get; set;} 

并在类中使用它,如下所示:

 this.Limit 

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

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

对于私有成员,我只在获取和/或设置值时使其成为属性应该导致其他事情发生,例如:

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

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

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

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

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

我觉得它也更清洁。

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

优点

  • 可以设置调试的断点,正如Jared所说,
  • 可能导致副作用,如Rex的EnsureValue()
  • getset可以有不同的访问限制(public get ,protected set ),
  • 可以在属性编辑器中使用,

缺点

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

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

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

喜欢IMO的最大理由是:

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

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

你class级的界面就是它与外界沟通的方式。 在字段上使用自动属性允许您更改类的内部,以防您需要设置该属性的值来执行某些操作或检查授权规则或类似的内容。

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

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

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

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

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

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

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

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

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

字段没有。

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

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

如果您的数据成员只需要设置并获取逻辑,那么属性是C#中非常好且快速的解决方案