为什么选择Properties作为公共变量?

Pau*_*ulB 18 c# syntax

其他能够在设置器中进行健全性检查值是否有更多潜在的理由来选择属性到公共变量?

Kon*_*lph 26

我们之前有过这个主题,但现在找不到任何东西.

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

这很糟糕,因为它可能会花费很多钱.

从一开始就使用属性可以避免此问题.这甚至可以计算不属于库的代码.为什么?因为您永远不会知道:代码(即使是高度特定于域的!)可能证明是有用的,因此您希望将其重构为库.如果您已经使用属性代替公共/受保护字段,那么这种重构过程显然会变得更加容易.

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

public DataType MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

  • (续)并且线程已关闭.但是短版本是用户要求的是一个项目而你正在给他们一个不相等的替代品.当你这样做时,用户通常会感到不快. (4认同)
  • 忽略应该问题,编译器无法做到这一点有很多原因.有两个原因立即浮现在脑海中.1)名称和2)调用属性与访问字段(性能,参考和输出)不同.不幸的是,这里没有足够的空间来真正评论 (3认同)

Sea*_*ean 8

简而言之:

  • 你可以控制
    access (readonly,writeonly,read/write)
  • 您可以在设置属性时验证值(检查null等)
  • 您可以执行其他处理,例如延迟初始化
  • 您可以更改基础实现.例如,属性现在可以由成员变量支持,但您可以将其更改为由DB行支持而不会破坏任何用户代码.


Kon*_*nos 5

杰夫·阿特伍德 (Jeff Atwood) 在博客上写到

有充分的理由来创建一个微不足道的财产,正如上面所描述的:

  • 反射在变量和属性上的工作方式不同,所以如果你依赖反射,使用所有属性会更容易。
  • 您不能对变量进行数据绑定。
  • 将变量更改为属性是一项重大更改

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

public property int Name;
Run Code Online (Sandbox Code Playgroud)

然而,如果变量和属性之间的区别是一个持续存在的问题,我想知道是否有更激进的解决方案。我们不能完全抛弃变量而支持属性吗?属性和变量做的事情不是完全一样,但对可见性有更好的粒度控制吗?