C#3.0の自動プロパティはファイルを完全に置き換えますか?
つまり、プロパティはプライベートバッキングフィールドとして機能するため、ファイルする代わりにプロパティを直接使用できます(申し訳ありませんが、私はそのようにしか理解していません)。
int a;
public int A
{
get;set;
}
C#3.0の自動プロパティはファイルを完全に置き換えますか?
つまり、プロパティはプライベートバッキングフィールドとして機能するため、ファイルする代わりにプロパティを直接使用できます(申し訳ありませんが、私はそのようにしか理解していません)。
int a;
public int A
{
get;set;
}
はい、自動プロパティには独自の保持フィールドがあります。
自動プロパティを定義すると、コンパイラは必要なバッキングフィールドを作成します。通常のコードのフィールドとしては使用できませんが、そこにあり、本当に必要な場合はリフレクションを介してアクセスできます。
詳細については、このガイドを参照してください:http: //msdn.microsoft.com/en-us/library/bb384054.aspx
コードからプロパティにアクセスする場合(クラスの内部または外部に関係なく)、常にプロパティとしてアクセスされます。ほとんどの場合、これは重要ではありませんが、参照によって渡すことができないことを意味します。これは、フィールドの場合に行うことができます。
バッキングフィールドに直接アクセスする(反射は別として)唯一のコードは、プロパティ自体です。
それは、純粋でシンプルなプロパティです。フィールドとしては使用できません。プロパティとして使用できます。C#コンパイラは、C#コンパイラへのアクセスをフィールドアクセスに置き換えません。それへのアクセスは常にプロパティアクセスです。もちろん、 JITコンパイラによってインライン化されることもありますが、それは特別なことではありません。CLRに関する限り、これは単なる通常のプロパティです([CompilerGenerated]属性が適用されている場合があります)。
しかし、元の質問に答えるために-はい、自動プロパティは、バッキングフィールドを自分で宣言する必要がないことを意味します。事実上、これは:
public int Foo { get; set; }
に翻訳されます
private int <>Foo; // Or some other unspeakable name
public int Foo
{
get { return <>Foo; }
set { <>Foo = value; }
}
生成されたフィールドには言葉では言い表せない名前があるため、C#コードで直接アクセスすることはできません。ただし、リフレクションを使用して型を調べると、それが存在することがわかります。CLRは、自動的に実装されたプロパティと「通常の」プロパティを区別しません。
デリゲートなど、コンパイラの魔法が関係しています。コンパイラが必要なコードの作成を担当しているように見えます。そうでない場合は、明示的に入力する必要があります。