2016-02-16 47 views
0

我得不到的是,爲什麼實例變量總是私有的,但是auto屬性將它們設置爲public?還是一樣?

我知道自動屬性是想讓事情變得更容易。

通常情況下:

private string name; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

隨着自動屬性:

public string Name { get; set; } 

但是,如果我們可以只聲明實例變量爲public,就像在汽車性能,我們爲什麼不聲明實例變量在正常版本中也是公共的?

那麼這與以前的完全一樣嗎? :

public string name; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 
+0

當屬性暴露時,字段或變量通常不會暴露在類之外。這種方式更爲常見。汽車物業是按照慣例設計的。 – Ian

+1

你可以在這個鏈接找到更多。 http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and-a-property-in-c –

回答

1

雖然你可以這樣做,但想象一下使用這個API並看到你有object.Nameobject.name。你如何知道使用哪一個?

一般來說,公共領域被認爲是不好的做法,因爲你給這個類的用戶全部權力的領域。即使自動屬性提供的功率相同,它可以更容易地將計算/過濾器添加到setter或getter,或者完全刪除setter或getter。

通過公開後臺字段,您可以讓用戶完全忽略您設置的任何驗證。

我想你可能會在這裏感到困惑。

正如你可以this try roslyn example看到,

public string Name { get; set; } 

編譯成:

private string <Name>k__BackingField; 
public string Name 
{ 
    get { return this.<Name>k__BackingField; } 
    set { this.<Name>k__BackingField = value; } 
} 

所以你可以看到,實際的字段存在,但其對所有人開放,所以它就像超級私人。但有時你可能不想要這個。我遇到過幾次,我真的希望屬性的類能夠訪問私有支持字段,以避免調用該集合並獲取,以避免無限循環,儘管我認爲這可能是一種不好的做法,並且應該避免。

但要指出的是,汽車物業在幕後有一個私人領域,並不是私人領域。

0

在一個理想的編程場景中,屬性在暴露在外部時被聲明爲public。

另一方面,這些字段是私人的,因爲它們不應該公開,因爲當它們的值發生變化時我們無法控制它們。另一方面,我們有這樣的屬性控制。

相關問題