2016-12-19 11 views
3

は時々私はそうのような読み取り専用のメンバーと定義されたクラスを参照してください読み取り専用プロパティ:読み取り専用フィールド対

class Foo 
{ 
    public Foo(string bar) 
    { 
     Bar = bar; 
    } 

    public string Bar { get; private set; } 
} 

第二の例:

class Foo 
{ 
    private readonly string bar; 

    public Foo(string bar) 
    { 
     this.bar = bar; 
    } 

    public string Bar => bar; 
} 

と、私はそうのような読み取り専用のメンバーと定義されたクラスを参照してください他の回私にはもっと読みやすく/簡潔に見えますが、最初の例ではreadonlyのバッキングフィールドを明示的に定義する正当な理由があるのだろうかと思っていましたか?

2つの例の詳細な分析を行い、理想的にはCLRの実際に何が起こっているのかを理解することができます。

+14

実際、第2版は非常に異なっています。同等のバージョンは 'public string Bar {get;}'となります。 'public string Bar {get;プライベートセット; } 'は読み込み専用ではなく、公的に設定可能ではありません。 –

+0

Scott、あなたのコメントは答えになるはずです。よく言った – Trey

+0

あなたの最初の例は私のためにコンパイルされません。 – user1620220

答えて

9

最初は、ゲッターを持つすべてのプロパティの

class Foo 
{ 
    private readonly string bar; 
    public Foo(string bar) 
    { 
     this.bar = bar; 
    } 
    public string get_Bar() { return this.bar; } 
} 

を書くの短い方法です。ゲッター関数を書くのは簡単な方法です。

目は再び、プロパティが舞台裏を取得/設定メソッドの単なるペアである場合は

class Foo 
{ 
    private string __bar; 
    public Foo(string bar) 
    { 
     this.set_Bar(bar); 
    } 
    public string get_Bar() { return this.__bar; } 
    private void set_Bar(string b) { this.__bar = b; } 
} 

を書くの短い方法です。

どちらの形が完全に正当なものである明示的に読み取り専用のバッキングフィールド

を定義するための正当な理由がある場合、私は思っていました。好きなものを選んでください。

2つのフォームは同等ではありません。最初のケースでは、プロパティのバッキングフィールドはコンストラクタでのみ変更できます。後者の場合、プロパティのバッキングフィールドはクラス内のどこでも変更できます。

+0

反射はどちらにも影響しますか? – series0ne

+0

@ series0ne:質問は分かりません。 –

+0

おそらく最初の例ではsetterを呼び出すことができないでしょう。おそらく、それが読み込み専用であるにもかかわらず、リフレクションは値をwilly-nillyに変更させるでしょうか? – series0ne

関連する問題