2011-08-16 17 views
5

不変型と可変型の違いを説明するための簡単なスニペットを作成しようとしています。 このコードはあなたにすべて正しいと思われますか?不変型と変更可能な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'フィールドがコンストラクタコードや初期化時にのみ割り当てられている限り、クラス内で' readonly'と 'normal 'フィールドを混在させることができます。 – Matten

+0

'ImmutableTypeExample MakeTestFoo()'はあまり意味がありません。それは静的であると思われますか? –

答えて

14

しかし、私はでもは "leaky"の変更について話します。たとえば:

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

私は、インスタンスが表示されますビルダーを変更することはできませんが、私は行うことができます。

value.Builder.Append("hello"); 

あなたがkinds of immutabilityにエリックリペットのブログ記事を読んで価値があるだろう - と確かにシリーズの残りのすべての投稿。

+0

つまり、この例は、使用する文字列プロパティも不変であるためにのみ機能します。あなたが変更可能なプロパティを持つとすぐに、ゲッターを介してのみ利用可能であっても、あなたは完全に不変ではありません。 –

+0

あなたはコレクション、不変/変更可能なクラスのペアなどについても考えているかもしれません。私はこの文脈で興味深いはずの記事を書いています:http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-不変の並行世界/ –

4

はい、そうです。

プライベートメンバーは、クラスが不変であるために読み取り専用である必要はないことに注意してください。これはクラス内の余分な予防策です。

+0

チップのおかげで – Hoody

関連する問題