2011-11-01 39 views
1

我一直在編碼類這樣當沒有特殊動作C#字段:我需要使用{get;組; }以獲取和設置

public class ReportViewModel 
    { 
     public string Status; 
     public string DataSource; 
     public String DataStore { get; set; } 
     public PageMeta PageMeta { get; set; } 
     public ICollection<Question> List { get; set; } 
    } 

注意,大多數字段使用{獲得;組; }除了我讓Visual Studio爲我添加的前兩個。

我想知道的是我真的需要使用{get;組; }。在我看來,VS2010不會自動添加這個,所以我需要它嗎?

+0

可能的重複[在C#中'Fields'和'Properties'有什麼區別?](http://stackoverflow.com/questions/4446929/what-is-the-difference-between-fields-and- properties-in-c) –

+0

@FrédéricHamidi - 值得鏈接,但我認爲這個提問者是從不同的方向來解決這個問題的,因此這增加了作爲一個單獨問題的價值。 – Keith

+0

[C#.NET 3.5+中屬性和字段之間的差異]的可能重複(http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-net-3- 5) – nawfal

回答

2

{ get; set; }指示自動實現的屬性。在.NET中,propertiesfields之間有區別。通常領域應該是私人的。它們被用於某些特定的實施,並且在大多數情況下應該是課堂內部的。另一方面,屬性用於封裝暴露給消費者的行爲。

+0

你好Darin,因爲這些在MVC3視圖模型中使用,並且他們是「愚蠢的」,沒有邏輯要求,你認爲把它們作爲字段有很大的區別嗎? –

+0

@SamanthaJ,現在你帶來關於ASP.NET MVC的主題,你應該總是在視圖模型中使用屬性。默認的模型聯編程序不能綁定到字段。 –

+0

您能解釋一下默認模型聯編程序的含義嗎?我有以下工作:ViewModel文件: public class ReportViewModel { public string Status;等等... CSHTML文件: @model xxx.ReportViewModel

@Model.Status

2

如果您希望它們正確顯示爲屬性,那麼是的。

1

他們是不同的:你的前兩名成員是fields - 不是properties。其他則是自動實現訪問器的屬性。

6

你已經創建了一個類有兩個公共領域StatusDataSource)和三個公共性質DataStorePageMetaList)。我建議不要公開領域 - 而且你應該考慮你是否真的需要所有這些都是可變屬性。

various advantages to using properties over public fields,但主要是在我心目中是一個屬性是邏輯類的API的一部分,而一個字段是邏輯的實現細節。該物業說什麼呼叫者可以做 - 一個字段說如何存儲一個值。

+0

如果你在這種情況下真的有「愚蠢」的屬性,使用公共獲取和設置,使用公共字段而不是屬性有什麼缺點? –

+4

@TomasJansson:你看過我在我的回答中鏈接到的頁面嗎? –

+0

錯過了它是一個鏈接,但我現在閱讀它。偉大的描述! –

0

不要必須,但這只是編碼stundart,其優點和缺點。 考慮這個鏈接更多的資源:

Property Acessors

1

如果不加get和您使用的是場而不是財產。在很多情況下,這種情況不會有很大的變化。但是,您無法像使用Property一樣綁定到某個字段。所以你會失去它。

1

有區別。前兩個是fields,其餘的是自動properties

第二個,編譯器生成一個私有後臺字段和一些鍋爐板get/set方法。這些允許您像訪問字段一樣訪問屬性,但具有僅用於屬性的優點。

總是建議隱藏屬性後面的字段,方法是將它們設置爲私有,並在其周圍編寫屬性或使用自動屬性。

屬性有一些優點。一種是屬性可以是隻讀的,甚至是隻寫的,或者是隻讀的,只有內部只寫等。由於它們的行爲與方法一樣,因此可以在其中執行任意代碼。當你需要實現諸如INotifyPropertyChanged之類的東西時,或者如果該屬性實際上是從其後面的幾個字段計算的,這是非常有用的。

另一個優點是封裝。你並不是把自己直接綁在班級的領域上,而是把自己與財產緊密聯繫在一起。因此,如果有關該字段的某些細節發生變化(說它消失並計算出來),那麼通過使用該屬性,您可以與這些實現細節隔離開來。

你當然應該看看在所有情況下使用屬性(現在加入{ get; set; })。它們是良好的實踐,因爲它們提供了一定程度的封裝,可以將用戶從實施細節中解脫出來。

1

完全取決於如何使用這個類。

如果這是你的代碼,只是在當前的產品中使用,那麼就沒有字段(無{get;set;})和性能(與{get;set;})之間確實太大的區別。

但是在這種情況下,它們可能不應該是public,而應該使它們爲internalprivate,以便很明顯外部代碼不應該使用它們。

如果你的類將被其他程序集使用,那麼你應該總是將公共字段轉換爲屬性。

原因是,如果您想稍後擴展屬性(即將一個主體添加到set),那麼您的用戶可以從您那裏獲得新的DLL。但是,如果您使用了字段,那麼將它們轉換爲屬性在IDE中看起來是相同的,但是需要用戶在獲取更改後的DLL時重新編譯。

正在public告訴消費者,他們可以依靠該成員在場,作爲一個財產讓你更好地控制你如何交付給他們。