私の質問は、文字列が値型のように動作するため、辞書に保持される文字列の複製が終了するかどうかです。
C#の文字列は値型ではありません。これらの文字列は、ほとんど同じように動作しません。
C#文字列は不変であり、連想型コンテナのキーとしての使用に適しています。ただし、文字列をキーとして使用したり、その他の容量で使用したりしても、コンテンツは複製されません。
ソース配列のSomeStringProperty
までの辞書キーの参照の等価性をチェックすることで、クローニングが行われていないことを確認できます。辞書の各キーは、ソース・アレイ中に存在するであろう:による文字列は値型のように振る舞うように
var data = new[] {
new Something {SomeIntProperty=1, SomeStringProperty="A"}
, new Something {SomeIntProperty=2, SomeStringProperty="A"}
, new Something {SomeIntProperty=3, SomeStringProperty="A"}
, new Something {SomeIntProperty=4, SomeStringProperty="A"}
, new Something {SomeIntProperty=5, SomeStringProperty="A"}
, new Something {SomeIntProperty=6, SomeStringProperty="B"}
, new Something {SomeIntProperty=7, SomeStringProperty="B"}
, new Something {SomeIntProperty=8, SomeStringProperty="C"}
, new Something {SomeIntProperty=9, SomeStringProperty="D"}
};
var dict = data.GroupBy(s => s.SomeStringProperty)
.ToDictionary(g => g.Key);
foreach (var key in dict.Keys) {
if (data.Any(s => ReferenceEquals(s.SomeStringProperty, key))) {
Console.WriteLine("Key '{0}' is present.", key);
} else {
Console.WriteLine("Key '{0}' is not present.", key);
}
}
上記コード印刷
Key 'A' is present.
Key 'B' is present.
Key 'C' is present.
Key 'D' is present.
Demo.
偉大な簡潔な説明。参照:[この回答](https://stackoverflow.com/questions/10792603/how-are-strings-passed-in-net) –