web-dev-qa-db-ja.com

C#6の読み取り専用プロパティとプライベートゲッター専用プロパティ

C#6に auto-property initializers が追加されました。

private List<LinearLayout> layouts1 { get; } = new List<LinearLayout>();

これはより良いか悪いか

private readonly List<LinearLayout> layouts2 = new List<LinearLayout>();

(これは2011年の質問 。NETプロパティ-プライベートセットまたは読み取り専用プロパティを使用しますか? に関連しています。

6
dumbledad

ここを見ると の場合、次のコードが表示されます。

_class Example
{
   private List<LinearLayout> layouts1 { get; } = new List<LinearLayout>();
}
_

コンパイラによって以下に下げられます:

_internal class Example
{
    private readonly List<LinearLayout> <layouts1>k__BackingField = new List<LinearLayout>();

    private List<LinearLayout> layouts1
    {
        get
        {
            return <layouts1>k__BackingField;
        }
    }
}
_

さらに、プロパティはget_layouts1()メソッド に下げられます。

言い換えれば、自動プロパティ初期化子は純粋な構文上の砂糖です。それらは、バッキングフィールドを初期化することを可能にしながら、自動プロパティを使用する手段を提供します。

したがって、可変性の観点からは、それらの間にまったく違いはありません。どちらも、クラスのインスタンスが作成されるときに初期化されるリストへの読み取り専用アクセスを提供します。

リスト参照を取得するためにメソッドを呼び出す必要があるため、わずかなパフォーマンスオーバーヘッドが生じる可能性がありますが、CLR JITがメソッドを最適化せずに、フィールドに直接アクセスするだけの可能性があります。

プライベートプロパティの最も明らかな使用法は、遅延読み込み/遅延実行の目的です 。他の使用法もありますが、ガイドラインとして、それらはしばしば無意味な「ノイズ」です。プライベートプロパティを使用することは、フィールドを使用することよりも悪いとまでは言いませんが、ほとんどの場合、読み取り専用フィールドを使用することをお勧めします。

9
David Arno

この場合、それらはほぼと同じように機能します。私有財産を理想的とは言えないようにする微妙な点が1つあります。

  • バイトコードは、getter関数を通じてList<LinearLayout>にアクセスします。ただし、ご使用の環境に合わせてバイトコードが再コンパイルされると(C#はこれを長い間行ってきました)、ゲッター関数は最適化されるため、実際の問題ではありません。

それらが同じように使用されている場合、実際的な違いはありません。

0
Berin Loritsch