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

为什么更喜欢属性而不是公共变量?[副本]

  •  19
  • PaulB  · 技术社区  · 16 年前

    8 回复  |  直到 16 年前
        1
  •  26
  •   Konrad Rudolph    16 年前

    我们以前有过这个话题,但现在什么也找不到。

    简而言之:你的需求可能会改变:如果现在没有理智检查,将来可能需要进行理智检查。但是,如果您将公共字段更改为属性,则会破坏二进制兼容性:使用您的代码/库的每个客户端都必须重新编译。

    这是 坏的

    从一开始就使用属性可以避免这个问题。这甚至适用于不属于库的代码。为什么?因为你永远不知道:代码(即使高度特定于领域!)可能会被证明是有用的,所以你想把它重构成一个库。如果你已经在使用属性来代替公共/受保护的字段,那么这个重构过程显然会变得容易得多。

    此外,在C#3.0中编写公共属性很容易,因为你可以直接使用自动实现的属性,从而节省大量代码:

    public DataType MyProperty { get; set; }
    

    将为您实现必要的支持字段和getter/setter代码。

    我将添加一个个人注释:。NET在这方面的行为有点懒散。编译器可以动态地将公共字段更改为属性,从而避免了这个问题。VB6已经为COM公开的类做了这件事,我认为VB.NET和C#绝对没有理由不这样做。也许编译器团队中的某个人(Jared?)可以对此发表评论。

        2
  •  8
  •   Sean    16 年前

    • 您可以控制访问权限(只读,
      只写、读/写)
    • 您可以在设置时验证值 属性(检查是否为null等)
    • 您可以进行额外的处理, 例如延迟初始化
    • 您可以更改底层 实施。例如,a 财产可能由会员担保 破解任何用户代码。
        3
  •  4
  •   Cœur Gustavo Armenta    7 年前

    Jeff Atwood has blogged about it :

    • 反射在变量和属性上的工作方式不同,因此如果您依赖反射,则更容易使用所有属性。
    • 不能对变量进行数据绑定。
    • 将变量更改为属性是 a breaking change .

    令人遗憾的是,变量和属性之间有这么多毫无意义的摩擦;大多数时候,他们做完全相同的事情。 Kevin Dente 提出了一种新的语法,可以让我们两全其美:

    public property int Name;
    

    我们不能完全抛弃变量,转而使用属性吗? 属性不是和变量做完全相同的事情,但对可见性有更好的粒度控制吗?

        4
  •  3
  •   Mehrdad Afshari    16 年前

    将来将字段更改为属性被认为是 突破性变化 字段被视为类的实现细节,公开它们会破坏封装。

        5
  •  2
  •   Relevant Carra    10 年前

    属性的使用使您的代码更加面向对象。通过公开成员变量,您可以公开您的实现。

    另请参见此 link C#编程指南

        6
  •  1
  •   LeJeune    16 年前

    您还可以使用属性保护写访问权限并允许读访问权限:

    public int Version { get; private set; }
    
        7
  •  0
  •   Mystic    16 年前

    如果你在一个封闭的环境中工作——你不开发SDK,所有的类都在同一个项目框架内使用——没有区别。

    使用公共字段更易读,装饰更少,更易于使用。

        8
  •  0
  •   Pim Jager    16 年前

    对。

    考虑一个现在包含字符串的公共变量,你可以简单地设置它。但是,如果你决定该公共变量应该包含一个应该用字符串初始化的对象,那么你就必须使用原始对象更改所有代码。但是,如果您使用了setter,则只需更改setter即可使用提供的字符串初始化对象。