2010-07-07 46 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生成一個方法調用。

並非每個應用程序都包含在一個分佈式單元中的所有片段。許多應用程序依賴於可插拔/可擴展性的接口。如果您的應用具有到某個字段的界面,並且想要將其更改爲屬性以利用屬性的強大功能,則應用程序必須重新編譯並重新分發。你可能只是首先把它變成財產。

相關問題