2017-01-18 6 views
0

enter image description here自動実装されたプロパティは実際にコンパイル時にプライベートフィールドを生成しますか?

コンパイルしてプログラムを実行した後:

class Person 
{ 
    private string surname; 

    public string Name { get; set; } 
    public string Surname 
    { 
     get { return surname;} 
     set 
     { 
      surname = value; 
     } 
    } 
} 

一つは見ることができ、リンクされた画像から、示さない「名前」プライベートフィールドがありません。 Visual Studioだけでは認識できないのですか、それとも何か他のことが起こっていますか?

私は、あなたの2つのC#の例では、もう一方は単純に構文的な砂糖です。または "コンパイル時にバッキングフィールドが作成されます。"

キャッチは何ですか?

+1

ちょうどそれについて考えてみてください。どのように彼らはできませんでしたか?それ以外の場合は、セッターが実行されたときにデータはどこに格納されますか?しかし、あなたはILコードを見て、必要ならそれを見ることができます。リフレクターを使用してください。 http://www.red-gate.com/products/dotnet-development/reflector/ –

+0

また、プライベートフィールドは 'name'と呼ばれません。有効なC#識別子ではない "unpronouncable"という名前が付けられます。これにより、別の目的のために識別子 'name'を使用するあなたが書いたかもしれないコードと衝突しないことが保証されます。 –

+0

私はhttps://tryroslyn.azurewebsites.netを提案する –

答えて

4

バッキングフィールドはデバッガによって表示されません。つまり、単にデバッガの設計者がコードをデバッグしている人が、自動プロパティのプライベートバッキングフィールドを見ていることが重要であると感じなかったということですプロパティ自体を介して。

using System.Reflection; 

    ... 

    var fields = typeof(Person) 
    .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
    .Select(field => field.Name); 

    Console.Write(string.Join(Environment.NewLine, fields)); 

をそして、あなたは、コンパイラバッキングフィールドを作成している見ることができるように

surname 
<Name>k__BackingField 

を得る:反射あなたが実際に何が起こっているかのレポートを取得することができますの助けを借りて

2

<Name>k__BackingFieldのautoプロパティ

0

コンパイル済み

using System; 

namespace ApagueMe 
{ 
    public class Class1 
    { 
     public string Asdf { get; set; } 
    } 
} 

次に、生成されたDLLを.NET Refletorで開きました。結果を見てください:

public class Class1 
{ 
    // Fields 
    [CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    private string <Asdf>k__BackingField; 

    // Properties 
    public string Asdf 
    { 
     [CompilerGenerated] 
     get 
     { 
      return this.<Asdf>k__BackingField; 
     } 
     [CompilerGenerated] 
     set 
     { 
      this.<Asdf>k__BackingField = value; 
     } 
    } 
} 
関連する問題