代码之家  ›  专栏  ›  技术社区  ›  Kevin

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

  •  24
  • Kevin  · 技术社区  · 17 年前

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

    10 回复  |  直到 17 年前
        1
  •  36
  •   Sled bayer    11 年前

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

    public string Name { get; set; }
    

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

        2
  •  13
  •   Scott Langham    17 年前

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

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

        3
  •  6
  •   AdamC    17 年前

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

        4
  •  6
  •   Quibblesome    17 年前

        5
  •  3
  •   Scott Dorman    17 年前

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

        6
  •  2
  •   Jon Skeet    17 年前

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

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

        7
  •  0
  •   marc    17 年前

        8
  •  0
  •   yfeldblum    17 年前

        9
  •  0
  •   Hafthor    17 年前

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

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

    正如Chris Anderson在本书后面所说的,如果打电话的人对场地和财产的区别视而不见,那将是理想的选择。

        10
  •  0
  •   David Robbins    17 年前

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

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