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