2016-04-22 4 views
2

私はgetterとsetterを持ついくつかの属性を持つクラスを持っています。私はこのクラスのオブジェクトを不変にしたい。私はセッターにvoidの代わりに戻り値の型を与えると考えていました。System.Collections.Immutableクラスの関数に行われています。今のところ私はこのようにそれをやった:C#でクラスの新しいインスタンスを返すセッターを作る方法は? (オブジェクトを不変にするため)

MyImmutableClass 
{ 
    public int MyAttribute { get; } 
    public MyImmutableClass SetMyAttribute(int attribute) 
    { 
     return new MyImmutableClass(attribute, ...); 
    } 

    ... 

    public MyImmutableClass(int attribute, ...) 
    { 
     MyAttribute = attribute; 
     ... 
    } 
} 

は、それが行われる必要がありますどのようにこのですか、より良い/よりよい方法はありますか?例えば、普通のセッターをmoddifyすることはできますか?

+0

なぜあなたは戻ってあなたはないはあなたが行うように読み取り専用のプロパティを持つことによって、もはや変更することができ、オブジェクトをあなたを与える作成方法、に全力を尽くしますあなたは不変クラスにセッターを持っていますか?もっともきれいな方法は、意味的に状態を変更するメソッドを避け、getterだけを持つ契約で明示的に設計することです。 「変更」では、ビルダーまたはプロトタイプのデザインパターンを使用して明示的に別のクラスを作成できます。 – ironstone13

答えて

2

静的なファクトリメソッドを使用し、プライベートコンストラクタを使用する必要があります。プロパティを作成しないでください(オブジェクトを作成するとになる可能性があります。は多くの作業になります>メソッドを使用する)。その後

public class MyImmutableClass 
{ 
    public int MyAttribute { get; } 

    private MyImmutableClass(int attribute, ...) 
    { 
     MyAttribute = attribute; 
     ... 
    } 

    public static MyImmutableClass Create(int attribute) 
    { 
     return new MyImmutableClass(attribute, ...); 
    } 
} 

それを使用します:

var myClass = MyImmutableClass.Create(2);