Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带访问器的公共变量与私有变量_C#_Oop_Accessor - Fatal编程技术网

C# 带访问器的公共变量与私有变量

C# 带访问器的公共变量与私有变量,c#,oop,accessor,C#,Oop,Accessor,有没有其他人见过这样的人: private string _name; public string Name{ get{ return _name; } set{ _name = value;}} 如果您打算对它的设置方式进行某种控制,或者在有get时对它执行某种功能,那么我理解使用访问器。但是,如果要这样做,为什么不首先公开变量呢?我错过了什么吗?准备。您永远不知道何时要删除set访问器、在setter中执行其他操作或更改get的数据源。可公开访问的成员通常应该是方法而不是字段。这只是一种良好

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

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

如果您打算对它的设置方式进行某种控制,或者在有get时对它执行某种功能,那么我理解使用访问器。但是,如果要这样做,为什么不首先公开变量呢?我错过了什么吗?

准备。您永远不知道何时要删除set访问器、在setter中执行其他操作或更改get的数据源。

可公开访问的成员通常应该是方法而不是字段。这只是一种良好的实践,这种实践有助于确保对象的封装状态始终在您的控制之下。

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

如果在程序集a中使用属性定义公共接口,则可以在程序集B中使用此接口

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

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


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

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

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

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

public string Name { get; set; }

这就消除了不将公共字段作为属性实现的唯一理由。

变量是类实现的一部分。属性更符合逻辑地表示它的接口。在C#3.0中,自动实现的属性从一开始就可以轻松实现


关于这一点,我写了更多的想法,包括从变量更改为属性不仅会破坏二进制兼容性,还会破坏源代码兼容性的各种方式。

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


正如Chris Anderson在本书后面所说的,如果调用方对字段和属性的差异视而不见,那将是理想的选择。

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


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

值得注意的是,.NET中的数据绑定也拒绝使用公共字段,并要求属性。所以这可能是另一个原因。

轻微的修正(尽管我同意一般的观点!)-自动实现的属性是C#3.0的一部分,而不是.NET 3.0的一部分。语言和框架之间的区别值得一提。作为一个VB.net用户,我很难过我们没有得到这样的好东西。我知道这是一个老帖子,但我想为来自搜索引擎的用户(比如我)添加这一点:从.net 4.0开始,VB.net还支持自动实现的属性:@JonSkeet我编辑答案以反映您的评论,因为人们很少阅读这些内容