2016-06-27 119 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

這仍然不回答OP的問題,發佈編輯。完全相同的原始數據存儲可以通過字段或屬性來完成。 –

+2

我認爲這個例子有點令人困惑(至少對我來說),但我同意這裏答案的總體精神。在一些複雜的情況下,一個班級可以很容易地擁有一個私人會員,這個私人會員出於各種各樣的原因被抽象出來。讀取或寫入該成員時要調用的一些常用邏輯,即使它只是私人調用。在公開對象的狀態時,公共屬性也可能想要利用相同的公共邏輯,因此將使用私有屬性作爲其支持數據而不是原始字段。 – David