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

时间:2008-10-03 18:16:26

标签: c# oop accessor

有没有其他人见过这样做:

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

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

10 个答案:

答案 0 :(得分:36)

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

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

public string Name { get; set; }

这消除了几乎没有理由不首先将公共字段实现为属性。

答案 1 :(得分:13)

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

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

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:6)

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

我已经写了更多这方面的想法,包括在an article on the topic中从变量变为属性的各种方式不仅打破了二进制兼容性,还打破了源兼容性。

答案 6 :(得分:0)

制备。你永远不知道什么时候你想要在路上删除set accessor,在setter中执行其他操作,或者更改get的数据源。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

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

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