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