79

以前は、次のようにプロパティを宣言していました。

public class MyClass
{
    private int _age;

    public int Age
    {
          get{ return _age;  }
          set{ _age = value; }
    }
}

これで、次のことができます。

public class MyClass
{
    public int Age {get; set;} 
}

私の質問は、この表記法を使用して自動的に作成されたプライベート変数にどのようにアクセスできますか?

パブリックアクセサー「Age」ではなく、プライベート変数にアクセスしたいと思います。プライベート変数にアクセスするためのデフォルトの表記法はありますか、それとも不可能ですか?

4

6 に答える 6

92

新しい自動プロパティの目的は、get または set で特別なロジックを必要としない単純なプロパティがある場合に、記述する必要があるボイラープレート コードの量を減らすことです。

これらのプロパティが使用するプライベート メンバーにアクセスする場合、通常はいくつかの理由があります。

  • 単純な get/set 以上のことが必要です。この場合、このメンバーに自動プロパティを使用することは避けてください。
  • get または set を通過することによるパフォーマンス ヒットを回避し、メンバーを直接使用する必要があります。この場合、実際にパフォーマンス ヒットがあったとしたら驚きです。単純な get/set メンバーは非常に簡単にインライン化できます。私の (確かに限定的な) テストでは、自動プロパティの使用とメンバーへの直接アクセスの違いは見つかりませんでした。
  • パブリック読み取りアクセス (つまり、'get' のみ) と、クラスがメンバーに直接書き込むことだけが必要です。この場合、自動プロパティでプライベート セットを使用できます。すなわち

    public class MyClass
    {
        public int Age {get; private set;} 
    }

これは通常、自動プロパティで使用されるバッキング フィールドに直接アクセスしたい理由のほとんどをカバーします。

于 2008-09-14T17:47:02.157 に答える
23

自動プロパティの使用は、プロパティの取得/設定ロジックを必要としないことを意味するため、プライベート バッキング変数は不要です。

クラスに複雑なロジックがある場合は、自動プロパティを使用しないでください。private int _age通常どおり、通常のゲッター/セッターを実行するだけです。

IMO、自動プロパティは、次のような使い捨てオブジェクトまたは一時的なデータ カプセルをすばやく実装するのにより適しています。

public class TempMessage {
    public int FromID { get; set; }
    public int ToID { get; set; }
    public string Message { get; set; }
}

あまりロジックを必要としない場合。

于 2008-09-14T17:35:10.533 に答える
12

この構文は、一般に「シンタックス シュガー」と呼ばれます。これは、コンパイラがその構文を取得して別のものに変換することを意味します。あなたの例では、コンパイラは次のようなコードを生成します。

[CompilerGenerated]
private int <Age>k_BackingField;

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }

そのすべてを知っていても、おそらくバッキング フィールドに直接アクセスできますが、それは自動プロパティを使用する目的を無効にします。おそらくここで言うのは、C# コンパイラの将来のリリースでいつでも変更される可能性がある実装の詳細に依存しているからです。

于 2008-09-14T17:34:00.580 に答える
10

舞台裏で何が起こるかは、<>k__AutomaticallyGeneratedPropertyField# で始まるプライベート メンバー変数の注入です。

C# 3.0 自動プロパティの説明から

そのプライベート メンバーを直接使用することは可能かもしれませんが、非常にハックで不必要です。

于 2008-09-14T17:27:26.090 に答える
7

すべきではありませんし、そうする必要がある可能性はほとんどありません。プロパティにアクセスする必要がある場合は、パブリック プロパティ (例: this.Age) を使用してください。パブリック プロパティをサポートするプライベート フィールドについて特別なことは何もありません。プロパティより優先して使用することは単なる迷信です。

于 2008-09-14T20:39:14.100 に答える
2

できません。これは IDE 機能ではなく言語機能です。正直に言うと、IDE でプライベート変数を追加することをお勧めします。クラスが内部的にパブリック エントリ ポイントを使用して独自の変数にアクセスする必要があるのは、少し奇妙であることに同意します。したがって、私はこの新機能をあまり使用しません。

于 2008-09-14T17:22:56.677 に答える