私は不変性が大好きです。なぜなら、他の人のコードを信頼して、同じままであると期待しているオブジェクトをいじらないようにする必要がないからです。
オブジェクトを などの別のコンポーネントに渡すと、List<T>
そのコンポーネントの動作に翻弄されます。これは、コレクションをプロパティとして返す場合に特に重要です。
public class Foo {
private List<Bar> _barList;
public ICollection<Bar> BarList { get return _barList; }
}
このクラスの消費者がコレクションを私の下から消去するのを止めるものは何もありません。戻り値の型を に切り替えても、IEnumerable<Bar>
完全に安全というわけではありません。不適切に記述されたコードの一部がこれをキャストしてList<T>
.Clear() を呼び出すことを止めるものは何もありません。
ただし、コレクションの一貫性を維持したい場合は、次のように書き直すことができます
public class Foo {
private ImmutableCollection<Bar> _barList;
public ImmutableCollection<Bar> BarList { get { return _barList; } }
}
これで、他のコードが自分のクラスを間違って使用することを信頼する必要がなくなりました。彼らはそれを台無しにすることはできません。