2016-07-14 55 views
4

把這個代碼:大寫屬性在C#中自動創建小寫私有屬性嗎?

public int Foo {get;set;} 

與此相對更完整的手工編寫代碼:

private int x; 
public int X 
{ 
    get { return x; } 
    set { x = value; } 
} 

在第一個例子,該編譯器自動創建一個私有財產foo

我不確定這個慣例是否見過面向公衆的大寫掩碼的小寫私有屬性就是那個慣例,或者它實際上是語言/編譯器的一部分,而且您可以寫它出來或讓它爲你做。

+1

深化他的背場,' {get; set;}'和'public int X => 10'只是語法糖 –

+0

public properties should always star t用大寫字母和私人字段應始終以下劃線開頭 – DestinatioN

回答

4

爲什麼不只是看看發生了什麼?

public class Test { 
    // private int myProp; 

    public int MyProp { 
     get; 
     set; 
    } 
    } 

...

string report = String.Join(Environment.NewLine, typeof(Test) 
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
    .Select(field => field.Name)); 

    Console.Write(report); 

,你會得到一個相當奇怪的名字

<MyProp>k__BackingField

但是這個陌生的支持字段名稱確保有會是否名稱衝突(您不能申報以<開頭的任何文件,財產,方法等)。

編輯:如果你取消註釋// private int myProp;線你就會有

myProp 
<MyProp>k__BackingField 

請,通知,myProp不是MyProp財產

+0

因此,我的第二個例子,屬性'x'和'X'只是相關的,因爲實現指定它是這樣的,而不是因爲C#的任何固有屬性?如果'X'只是'{get;組; }那麼他們會是兩個不相關的屬性? – Aerovistae

+1

@Aerovistae:你說得很對:你將* field *'x'與* property *'X無關;和屬性'X'將有自己的*後臺字段*和那個奇怪的自動生成的名字。 –

3

套管與它無關。

寫像下面

public int x { get; set; } 

總是會創建並使用它通過get/set操縱匿名私人領域的財產。

+0

「像下面一樣」。 。 。你的意思是你什麼時候不填寫getter和setter函數,只寫'get;'和'set;'?如果你填寫一個而不是另一個呢? – Aerovistae

+0

@Aerovistae試試吧。編譯器不允許這樣寫 – HimBromBeere

+2

public int x {get; }'會有區別,它創建一個'readonly'字段,而不是一個普通字段。 –

1

編譯器確實會爲您創建一個所需類型的私有後臺字段,但是使用另一個名稱(不像您的示例中那樣只是x,它更像<X>_BackingField)。因此你不能訪問該領域。但是,實際的語法非常相似。

有在auto-generated properties進一步看:

編譯器創建,只能通過屬性的get和set訪問訪問的私有,匿名的支持字段。

說了這話後,你的問題中的兩個代碼樣本的含義是相同的。