公共变量与具有访问器的私有变量

有没有人见过人们这样做:

private string _name; public string Name{ get{ return _name; } set{ _name = value;}} 

我理解使用访问器,如果你要对它的设置方式进行某种控制,或者在有get时对其执行某种function。 但是如果你只是要这样做,为什么不把变量公之于众? 我错过了什么吗?

如果您将该成员设置为公共字段,则无法在不更改类的接口的情况下将其重构为属性。 如果从一开始就将它作为属性公开,则可以对所需的属性访问器函数进行任何更改,并且类的接口保持不变。

请注意,从C#3.0开始,您可以在不创建支持字段的情况下实现属性,例如:

 public string Name { get; set; } 

这消除了几乎不是首先将公共字段实现为属性的唯一理由。

如果在程序集A中定义具有属性的公共接口,则可以在程序集B中使用此接口。

现在,您可以更改属性的实现(可能从数据库中获取值而不是将其存储在字段中)。 然后,您可以重新编译程序集A,并替换旧程序集。 assemblyB将继续正常,因为界面不会改变。

但是,如果您最初使用公共字段开始,并且认为这不适合并且想要更改实现并且需要将其转换为属性,那么这将意味着您必须更改程序集A的公共接口。 该接口的任何客户端(包括程序集B)也必须重新编译和替换,以便能够使用这个新接口。

所以,最好先从房产开始。 这封装了属性的实现,让您可以在将来自由更改它,而不必担心使用程序集A在世界上已经出现了什么客户端(包括程序集B)。因为,如果世界上已有任何客户端利用程序集A,更改接口会破坏所有客户端。 如果他们被你公司的另一个团队或其他公司使用,那么如果你通过改变你的界面打破他们的集会,他们将会不高兴!

我们的想法是,如果您使用访问器,则可以在不更改API的情况下更改底层实现。 例如,如果您决定在设置名称时,还需要更新文本框或其他变量,则不必更改任何客户端代码。

值得注意的是.NET中的DataBinding也拒绝处理公共字段并要求属性。 这可能是另一个原因。

良好的编程习惯。 这是一种非常常见的模式,符合OO设计方法。 通过公开公共字段,您可以公开数据存储方式的内部结构。 使用公共属性可以更灵活地更改数据在内部存储的方式,而不会破坏公共接口。 它还允许您更好地控制访问数据时发生的事情(延迟初始化,空检查等)

变量是类实现的一部分。 属性在逻辑上更能代表它的接口。 使用C#3.0,自动实现的属性从一开始就可以轻松完成。

我在这篇文章中写了更多的想法,包括从变量到属性的变化不仅打破了二进制兼容性而且打破了源兼容性的各种方式。

制备。 您永远不知道何时需要在路上移除set访问器,在setter中执行其他操作,或更改get的数据源。

公众可访问的成员通常应该是方法而不是字段。 这只是一种很好的做法,这种做法可以帮助您确保对象的封装状态始终在您的控制之下。

对于封装,建议不要使用公共字段。

http://my.safaribooksonline.com/9780321578815/ch05lev1sec5?displaygrbooks=0

正如克里斯安德森在本书后面所说的那样,如果来电者对场地与财产的差异视而不见,那将是理想的。

要保持高度的可扩展性而不必重新编译所有程序集,您需要使用公共属性作为访问者。 通过遵循“合同”或描述您的对象如何交换数据的定义机制,将实施一组规则。 此合约使用接口强制执行,并由inheritance此接口的类的getter和setter完成。

稍后,如果您从该界面创建其他类,您可以灵活地使用属性来遵守合同,但由于您通过getter和setter提供数据,因此组装数据的实现或过程可以是您的任何内容想要,因为它返回“合同”期望的类型。