2011-02-08 9 views
0

C#の辞書キー(おそらくほとんどの言語で)は不変でなければなりません。不変オブジェクトにポインタが許可されていますか?

私は今、別のオブジェクトのいくつかのプロパティに依存するように私のキーの値を作る可能性を考えます。

一般に、不変オブジェクトは別のオブジェクトへのポインタを持つ可能性がありますか?
この他のオブジェクトを変更すると、不変オブジェクトは状態を変更しませんでした。
しかし、これは動作が異なる場合があります。

これは不変オブジェクトに許可されていますか?
これは悪い習慣か反対の良い習慣とみなされますか?

+0

"不変オブジェクトは別のオブジェクトへのポインタを持つ可能性があります"と私は同意できません。参照オブジェクトが変更され、不変オブジェクト "状態"が変更されます。このタイプの不変オブジェクトの例がありますか? – Tony

+0

@トニー:それは私の言いたいことですが、私はそれがどういうわけか(ポインタを使うことを考えていました。例はありません)。だからあなたは言う:ポインタは、不変オブジェクトで許可されていない? – Gerard

答えて

1

不変オブジェクトにポインタを置くことができます。これは、浅いものと深い不変性の違いです。

は、オブジェクトが変更可能なオブジェクトへの不変の参照を保持したことには何も問題はありませんImmutability in C# Part One: Kinds of Immutability

0

MSDNのブログの記事を見てください。 Inddedは、時には有用なパターンになることがあります。例えば、コレクションは列挙の多数のメソッドを公開するかもしれません。これを実現する最も簡単な方法は、それぞれが1つのアイテムを保持する多数の構造体を定義することです。コレクションへの参照、コレクション内の適切なメソッドを呼び出すことによってIEnumerable.GetEnumeratorを実装します。たとえば、MyMultiSortedKeyDictionary.EnumeratorByFirstKey構造体は、MyMultiSortedkeyDictionaryへの参照を保持し、ルートコレクションでGetFirstKeyEnumeratorを呼び出してIEnumerable.GetEnumeratorを実装します。構造体.EnumeratorBySecondKeyも同様ですが、GetSecondKeyEnumeratorを呼び出します。どちらの構造も不変ですが、それぞれは可変オブジェクトへの参照を保持します。