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