2013-04-26 29 views
0

我有這個差(與不{;設置;得到})

public int CityId { get; set; } 

public int CityId; 

如果我先用 - 它在EF代碼工作第一,而第二 - 不。但是,如果我確定{get; set;}並且別無其他,那麼簡單定義之間的確切區別是什麼?我知道我可以在{get; set;}佈局中添加一些額外的/定製的代碼,但是如果沒有{get; set;},它的工作原理是否完全相同?

+1

後者是一個領域,前者是財產。 – vcsjones 2013-04-26 20:20:50

+0

長期來看,屬性提供了額外的好處(例如聲明爲「虛擬」,「抽象」或在接口中的能力)。有時很顯然,即使調用/使用代碼可能相同(如同樣的C#語法一樣,從_look_分配/獲取值),這是一次徹底改變。利用您的代碼的第三方_must_必須重新編譯其代碼以匹配更改。如果他們只是在不重新編譯的情況下替換已編譯的DLL,則會收到運行時錯誤。 – 2013-04-26 20:37:50

+0

我不能說EF,但我過去的經驗與NHibernate _required_成員屬性(也許甚至虛擬?也許只是懶惰加載行李/集合),因爲它會編譯_subclasses_在飛行將覆蓋/實施屬性行爲來延遲從數據庫加載數據。這種行爲(可能)不適用於字段。 – 2013-04-26 20:40:24

回答

2
public int CityId; 

這是一個字段。

public int CityId { get; set; } 

這是一個屬性,編譯器會自動爲您生成一個私人字段以備份屬性。

它們是兩個不同的東西。屬性提供了一個getter,一個setter或者兩者兼有。屬性的「get」和「set」操作被編譯爲方法調用。

一個字段只是一個暴露的變量。一般認爲這些領域是公開的不好的做法。

+0

'一般認爲屬性公開是不好的做法。「 - 你的意思是變量而不是屬性,否則,你能解釋爲什麼嗎? – 2013-04-26 20:27:47

+1

我的意思是字段,而不是屬性。這是我今天在SO答案中所做出的第二個明顯和可怕的錯誤... – cdhowie 2013-04-26 20:39:17

+0

別擔心:))你非常有幫助:)) – 2013-04-26 20:47:54

2

有了這個語法:

public int CityId { get; set; } 

你實際上是創建一個自動實現的屬性和幕後它被翻譯成這樣:

private int _CityId; 
public int CityId { 
    get 
    { 
     return _CityId; 
    } 
    set 
    { 
     _CityId = value; 
    } 
} 

這句法:

public int CityId; 

只是一個字段

1

您正在尋找的差異稱爲封裝。

example

在您的例子是不是字段和屬性之間有很大的區別。該字段的性能比屬性更好,因爲它不需要調用訪問它的方法。無論如何,一個領域的缺點是每個人都可以訪問它,而你(持有該領域的班級)對此沒有任何控制。

+0

我認爲你的答案解釋了我的問題,作爲對cdhowie答案的評論!謝謝! – 2013-04-26 20:32:50