任何理由使用自动实现的属性超过手动实现的属性?

我理解了PROPERTIES超过FIELDS的优点,但是我觉得使用AUTO实现的属性而不是MANUAL实现的属性并没有提供任何优势,只是让代码更加简洁一些。

我感觉更舒适的使用:

private string _postalCode; public string PostalCode { get { return _postalCode; } set { _postalCode = value; } } 

代替:

 public string PostalCode { get; set; } 

主要是因为如果我想要做任何自定义的get和set的实现,我必须创build自己的属性,无论如何由私人领域支持。 那么,为什么不从一开始就咬住子弹,为了一致性而立即给予所有属性这种灵活性? 考虑到您在Visual Studio中所要做的只是点击您的私有字段名称,然后按Ctrl + E,就完成了。 如果我手动执行,那么最终会出现一些不一致性,其中有一些由专用字段支持的手动创build的公共属性,以及一些自动实现的属性。 我感觉好多了,无论是全自动还是全手动。

这只是我吗? 我错过了什么吗? 我误解了什么吗? 我是否过分强调一致性? 我总是可以find有关C#特性的合法讨论,几乎总是有利有弊,但在这种情况下,我确实找不到任何人推荐使用自动实现的属性。

除简洁之外,它不会给你任何额外的东西。 如果你更喜欢更详细的语法,那么通过一切手段,使用它。

使用汽车道具的一个好处是,它可以帮助你避免犯一个愚蠢的编码错误,比如意外地把错误的私有variables分配给一个属性。 相信我,我已经做到了!

你关于汽车道具不太灵活的观点是很好的。 你有唯一的灵活性是通过使用private getprivate set来限制范围。 如果你的吸气者或安装者对他们有任何的复杂性,那么汽车道具不再是一个可行的select。

自动实现的属性不保证在构build之间保持相同的后台字段名称。 因此,从理论上讲 ,序列化一个版本的程序集中的对象,然后在另一个程序集中重新序列化同一个对象可能会导致重大更改。

这是不太可能的,但如果你想保持为新版本“换出”你的程序集版本的能力,这是一个有效的担心。

通过使用手动实现的属性,可以保证后台字段永不改变(除非你专门改变它)。

除了那个微小的差别,一个自动属性是一个普通的属性,自动实现一个后台字段。

有人认为自动属性可能有点邪恶,但除了它们只是语法糖。 除了保存几行代码之外,您不需要使用它们就可以获得任何东西,您可以为自己创build更多的工作(之后无论如何都要手动实现,因为您想要执行一些检查或引发事件)。 一致性在编程(imho)中非常有价值。

你将失去控制的事情之一是能够将支持字段指定为NonSerialized,但是在这种情况下很容易为属性创build一个支持字段。

忘记:如果您或任何您使用的产品在成员(即WCF)上执行reflection,那么您将看到损坏的后台字段名称,而不是您创build的“漂亮”后台字段。

如果您以前提供了对服务的访问权限,或者在接收端反序列化为相同的类结构(即在WCFpipe道的两端使用相同的类),这可能非常重要。 在这种情况下,你不一定能够反序列化,因为你可以保证支持域名是相同的,除非你共享相同的DLL而不是源代码。

再澄清一点:假设您有一个Web服务,通​​过WCF将您的一些业务对象公开给您创build的Silverlight客户端。 为了重用您的业务逻辑,您的Silverlight客户端添加了对业务对象源代码的引用。 如果您有自动实施的属性,则无法控制后备字段名称。 由于WCF序列化成员而不是属性,因此不能确定从WCF服务传输到Silverlight的对象将正确反序列化,因为后备字段名称几乎肯定会不匹配。

我不了解其他人,但是我倾向于暂停一下,想一想我应该如何命名我的variables函数,以便其他人能够理解我的代码。

所以当我使用自动实现的属性时, 我只需要暂停一次

当我需要一个支持领域, 我不得不暂停两次 ,所以它减缓发展了一下:)

我这样做的方式是:

  1. 把它作为一个私有variables在开始
  2. 如果需要,请将其更改为公开自动实施。
  3. 如果我需要获取或设置一些代码,将其更改为支持字段。

如果一个类的不同属性暴露不同,没有什么不对的。

我看到使用汽车性能的一个优点是: 在debugging应用程序时, 它不会进入不必要的Get / Set部分 。 我知道我们可以使用Debugger Attributes或Step over来避免同样的情况。 但是,如果在大型应用程序上进行debugging,则会发生大多数情况。