为什么选择Properties作为公共变量?
其他能够在设置器中进行健全性检查值是否更偏向于将属性更改为公共变量?
我们之前有过这个主题,但现在找不到任何东西。
简而言之:您的需求可能会发生变化:现在没有健全性检查,未来可能需要检查。 但是,如果将公共字段更改为属性,则会破坏二进制兼容性:使用您的代码/库的每个客户端都必须重新编译。
这很糟糕,因为它可能会花费很多钱。
从头开始使用属性可以避免此问题。 这甚至可以计算不属于库的代码。 为什么? 因为您永远不会知道:代码(即使是高度特定于域的!)可能certificate是有用的,因此您希望将其重构为库。 如果您已经使用属性代替公共/受保护字段,那么这种重构过程显然会变得更加容易。
此外,在C#3.0中编写公共属性很容易,因为您可以使用自动实现的属性,从而节省了相当多的代码:
public DataType MyProperty { get; set; }
将为您实现必要的支持字段和getter / setter代码。
我将添加一个个人注释:.NET在这方面的行为有点懒惰。 编译器可以在运行时将公共字段更改为属性,从而避免出现问题。 VB6已经为暴露于COM的类做了这个,我认为VB.NET和C#完全没有理由不这样做。 也许编译团队中的某个人(Jared?)可以对此发表评论。
简而言之:
- 你可以控制访问(只读,
writeonly,读/写) - 您可以在设置属性时validation值(检查null等)
- 您可以执行其他处理,例如延迟初始化
- 您可以更改基础实现。 例如,属性现在可以由成员变量支持,但您可以将其更改为由DB行支持而不会破坏任何用户代码。
Jeff Atwood在博客中写道 :
正如上所述,有充分理由制作一个简单的财产:
- reflection在变量与属性上的工作方式不同,因此如果依赖于reflection,则更容易使用所有属性。
- 您无法对变量进行数据绑定。
- 将变量更改为属性是一个重大变化 。
令人遗憾的是,变量和属性之间存在着无意义的摩擦; 大部分时间他们做同样的事情。 Kevin Dente提出了一些新的语法,它将为我们提供两全其美的优势:
public property int Name;
但是,如果变量和属性之间的区别是一个持续存在的问题,我想知道是否有一个更激进的解决方案。 难道我们不能完全抛弃变量以支持属性吗? 不是属性与变量完全相同,而是通过更好的粒度控制可见性?
将来将字段更改为属性被视为一种重大变化 。 字段被认为是类的实现细节,并公开它们公开打破封装。
您还可以保护写访问权限并允许使用属性进行读访问:
public int Version { get; private set; }
如果你在一个封闭的环境中工作 – 你不开发SDK,所有类都在同一个项目框架中使用 – 没有区别。
通常的论点是“将来您可能需要对值进行一些检查,因此使用属性更容易”。 我根本不买它。
使用公共字段更具可读性,更少装饰且更易于使用。
使用属性使您的代码更加面向对象。 通过将成员变量公开,您将公开您的实现。
另请参阅C#编程指南中的此链接
是。
考虑一个现在包含字符串的公共变量,您可以简单地设置它。 但是,如果您确定该公共变量应该包含应该使用字符串初始化的对象,那么您必须使用原始对象更改所有代码。 但是如果您使用了setter,则只需要更改setter以使用提供的字符串初始化对象。