2016-07-14 6 views
4

このコードを取る最初の例では大文字のプロパティは、C#で小文字のプライベートプロパティを自動的に作成しますか?このより完全な手作業で書かれたコードとは対照的に</p> <pre><code>public int Foo {get;set;} </code></pre> <p>:

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

、コンパイラが自動的にプライベートfooプロパティを作成していますか?

大文字小文字の大文字小文字をマスクした小文字の小文字のプロパティーを、このコンベンションで使用しているのかどうかはわかりませんが、実際には言語/コンパイラの一部ですそれはあなたのためにやってくれます。

+1

のバッキングフィールドがないことを

myProp <MyProp>k__BackingField 

てください、通知があります場合は、 ' {get; set;} 'と' public int X => 10'は文法的な砂糖だけです –

+0

publicプロパティは常にスターです大文字と非公開のフィールドを持つ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プロパティ

+0

私の2番目の例では、プロパティー 'x'と' X'は、実装がそうであると指定しているだけなので、関連しています。 'X 'が単純に' {get;セット; } 'それは2つの無関係のプロパティでしょうか? – Aerovistae

+1

@Aerovistae:あなたは大丈夫です。*フィールド* 'x'は* property *' X'とは無関係です。そのプロパティー 'X'はその奇妙な自動生成された名前を持つ独自の*バッキングフィールド*を持ちます。 –

3

ケーシングはそれとは関係ありません。

以下
public int x { get; set; } 

のようにプロパティを書き込むと、常にそれがget/set経由で操作する匿名のプライベートフィールドを作成して使用します。

+0

」としてください(下のように)。 。 。 getterとsetterの関数を記入しないで、 'get;'と 'set;'と書くだけでいいのですか?あなたが1つではなく他のものを記入するとどうなりますか? – Aerovistae

+0

@Aerovistae試してみてください。コンパイラはそれを許可しません。 – HimBromBeere

+2

'public int x {get; } 'は、通常のフィールドではなく' readonly'フィールドを作成する点で違いがあります。 –

1

コンパイラは、希望のタイプのプライベートバッキングフィールドを作成しますが、別の名前(例:xではなく、のようなものです)を使用します。したがって、あなたはフィールドにアクセスすることはできません。しかし、実際の構文は非常に似ています。

auto-generated propertiesでさらに見てください:

コンパイラは唯一のプロパティのgetとセットアクセサを介してアクセスすることができるプライベート、匿名バッキングフィールドを作成します。

あなたの質問内の2つのコードサンプルは、意味が同じです。

関連する問題

 関連する問題