2011-08-16 61 views
5

我想寫一個快速片段展示的可變和不可變類型之間的區別。 這段代碼是否適合你?永恆VS易變的C#

class MutableTypeExample 
{ 
    private string _test; //members are not readonly 
    public string Test 
    { 
     get { return _test; } 
     set { _test = value; } //class is mutable because it can be modified after being created 
    } 

    public MutableTypeExample(string test) 
    { 
     _test = test; 
    } 

    public void MakeTestFoo() 
    { 
     this.Test = "FOO!"; 
    } 
} 

class ImmutableTypeExample 
{ 
    private readonly string _test; //all members are readonly 
    public string Test 
    { 
     get { return _test; } //no set allowed 
    } 

    public ImmutableTypeExample(string test) //immutable means you can only set members in the consutrctor. Once the object is instantiated it cannot be altered 
    { 
     _test = test; 
    } 

    public ImmutableTypeExample MakeTestFoo() 
    { 
     //this.Test = "FOO!"; //not allowed because it is readonly 
     return new ImmutableTypeExample("FOO!"); 
    } 
} 
+0

這並不是說是可變的,但現場的類。只要只在構造函數代碼中或初始化時分配'readonly'字段,就可以在類中混合「只讀」和「正常」字段。 – Matten

+0

'ImmutableTypeExample MakeTestFoo()'沒有多大意義。它應該是靜態的嗎? –

回答

14

是的,看起來很合理。

不過,我也談「漏」可變性。例如:

public class AppearsImmutableButIsntDeeplyImmutable 
{ 
    private readonly StringBuilder builder = new StringBuilder(); 
    public StringBuilder Builder { get { return builder; } } 
} 

我不能改變建設者的實例出現,但我可以這樣做:

value.Builder.Append("hello"); 

這將是值得你kinds of immutability閱讀埃裏克利珀的博客文章 - 和事實上,系列中的所有其他職位。

+0

換句話說,該示例僅適用,因爲它使用的字符串屬性也恰好是不可變的。只要你有一個可變屬性,即使它只通過一個getter可用,你也不完全不可變。 –

+0

你也可以推論的集合,不可改變/可變類對等我寫了一篇關於最近的一篇文章在這方面應該是很有意思:http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-不可變的並行世界/ –

4

是的,這看起來正確的。

注意的是,私有成員並不需要是隻讀的類是不可變的,這只是一個額外的預防措施agains打破了類內部代碼。

+0

感謝您的提示 – Hoody