2010-07-07 43 views
13

这两者之间:为什么我应该使用自动实现的属性而不是字段?

财产:

class WithProperty 
{ 
    public string MyString {get; set;} 
} 

与现场:

class WithField 
{ 
    public string MyString; 
} 

显然我应该选择第一个。为什么?

我听说过这里的意思是允许更改接口,但是如果我有第二个接口并且将其更改为第一个接口,则将不得不更改。重新编译时,一切都将指向 属性。

我在这里错过了一些重要的东西吗?

+0

可能涉及:http://stackoverflow.com/questions/863182/changing-fields-to -property-is-a-breaking-change-under-what-scenarios – mmcdole 2010-07-07 20:16:44

+8

Jon Skeet在这个问题上有一篇很好的文章:http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx – Odrade 2010-07-07 20:20:14

回答

19

最重要的区别是,如果您使用一个字段,并且以后需要将其更改为一个属性(例如,强制进行一些验证),那么所有调用您的代码的库都需要重新编译。确实,如果名称保持不变,则可以编译完全相同的代码 - 但是代码的使用者仍然需要重新编译。这是因为获取值的IL在字段和属性之间是不同的。如果它已经是一个属性,则可以在不强迫代码的消费者更改的情况下进行更改。

这可能是也可能不是你的问题。但该属性的代码量几乎相同,并被认为是最佳实践。我会永远为财产。

+1

我也是如此。不喜欢跟随“人群在干什么”而不理解为什么:) – 2010-07-07 20:27:15

9

如果您需要在不破坏其他程序集的情况下添加验证或其他逻辑,以后可以更改该属性。

此外,该属性可与数据绑定一起使用。

0

有财产,你可以很容易延伸它包括新的逻辑。

例如,如果您需要将验证逻辑添加到set

+0

是的,但我可以做t帽子就像田野一样简单。将属性转换为字段不是对任何调用代码的语法更改。如果我需要这种逻辑,我明白它需要成为一个财产。我在问我不在的情况。 – 2010-07-07 20:19:57

2

你缺少的重要组成部分,是这句话的严重性:

当编译

当你的代码点到一个领域,你改变它指向相同的属性名称,C#本身不会改变,但是由此产生的IL会 - 它会根据需要为getter或setter生成一个方法调用。

并非每个应用程序都包含在一个分布式单元中的所有片段。许多应用程序依赖于可插拔/可扩展性的接口。如果您的应用具有到某个字段的界面,并且想要将其更改为属性以利用属性的强大功能,则应用程序必须重新编译并重新分发。你可能只是首先把它变成财产。

相关问题