3

C#3.0の自動プロパティはファイルを完全に置き換えますか?

つまり、プロパティはプライベートバッキングフィールドとして機能するため、ファイルする代わりにプロパティを直接使用できます(申し訳ありませんが、私はそのようにしか理解していません)。

int a;

public int A
{
  get;set;
 }
4

3 に答える 3

7

はい、自動プロパティには独自の保持フィールドがあります。

自動プロパティを定義すると、コンパイラは必要なバッキングフィールドを作成します。通常のコードのフィールドとしては使用できませんが、そこにあり、本当に必要な場合はリフレクションを介してアクセスできます。

詳細については、このガイドを参照してください:http: //msdn.microsoft.com/en-us/library/bb384054.aspx

于 2009-11-14T19:09:09.607 に答える
7

コードからプロパティにアクセスする場合(クラスの内部または外部に関係なく)、常にプロパティとしてアクセスされます。ほとんどの場合、これは重要ではありませんが、参照によって渡すことができないことを意味します。これは、フィールドの場合に行うことができます

バッキングフィールドに直接アクセスする(反射は別として)唯一のコードは、プロパティ自体です。

それは、純粋でシンプルなプロパティです。フィールドとしては使用できません。プロパティとして使用できます。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は、自動的に実装されたプロパティと「通常の」プロパティを区別しません。

于 2009-11-14T19:18:53.330 に答える
0

デリゲートなど、コンパイラの魔法が関係しています。コンパイラが必要なコードの作成を担当しているように見えます。そうでない場合は、明示的に入力する必要があります。

于 2009-11-14T19:19:40.710 に答える