2016-06-27 5 views
3

私はいくつかのコードを見て、パターンのこの種を発見したよ:プライベートプロパティを使用してパブリックプロパティをバックアップしますか?

private string text { get; set; } 
public string Text 
{ 
    get 
    { 
     return text; 
    } 
    set 
    { 
     text= value; 
     RaisePropertyChanged("Text"); 
    } 
} 

私は通常ちょうど民間分野での私のパブリックプロパティをバックアップ。

このような私有財産で財産を裏付ける理由はありますか?私の本能はそうすべきではないと言っているのですが、これは代わりにフィールドに裏打ちされなければなりません。これをバックアップするのに使用できる技術的な理由はありますか?

+0

これが働かない理由はありません。これで実際に問題が発生しましたか? – David

+3

ここには技術的な制限はありませんが、この場合は常にフィールドを使用するようにすることをおすすめします。 –

+0

これを行うには、正当な理由はありませんが、技術的にはうまくいかない理由はありません。あなたはそれを行う場合(ILの出力を比較する必要があります)、それは私が別のプロパティの代わりに変数を使用する古典的な方法を行くだろうが、より多くのオーバーヘッドが関与する可能性があります。オプティマイザはプライベート汎用プロパティをフィールドに変換できますか? –

答えて

1

典型的なケースは、あなたが生データ(それがどんな変換することなくそのままデータ)と同じデータを持っている場合ですが、優しい表される:

private String m_RawText; 

    // Text as it's obtained from, say, database 
    private string rawText { 
    get { 
     if (null == m_RawText) 
     m_RawText = ReadValueFromDataBase(); 

     return m_RawText; 
    } 
    set { 
     if (m_RawText != value) { 
     UpdateValueInDataBase(value); 

     m_RawText = value; 
     } 
    } 
    } 

    // Friendly encoded text, for say UI 
    public string Text { 
    get { 
     return EncondeText(rawTex); 
    } 
    set { 
     rawText = DecodeText(value); 

     RaisePropertyChanged("Text"); 
    } 
} 

// Here we want rawText 
public void PerformSomething() { 
    String text = rawText; // we want raw text... 
    ... 
} 

// And here we prefer Text 
public override String ToString() { 
    return String.Fromat("Text = {0} ", Text, ...) 
} 
+0

このSTILLは、OPの質問、投稿の編集には答えません。まったく同じ生データストレージは、フィールドまたはプロパティで実行できます。 –

+2

私はこの例が(少なくとも私にとっては)ちょっと混乱していると思いますが、私は答えの全体的な精神に同意します。適度に複雑なシナリオでも、クラスはさまざまな理由でプロパティの後ろに抽象化されたプライベートメンバーを簡単に持つことができます。そのメンバーを読んだり書いたりするときに呼び出されるいくつかの一般的なロジックです。オブジェクトの状態を公開するときには、パブリックプロパティも同じ共通ロジックを利用することができ、プライベートプロパティを生フィールドの代わりにバッキングデータとして使用します。 – David

関連する問題