3

ListsC#で使用しているときに、いくつかの紛らわしい動作に遭遇しました。特定のタイプのコレクション(との両方List<T>でテスト済み)を(つまり)に追加すると、子を変更すると、それが追加された親のコンテンツも変更されます。ただし、コレクションではないオブジェクト(つまり、または)をに追加した場合、オブジェクト自体を変更しても、追加されたの内容は変更されません。以下にいくつかのサンプルコードを含めました。ArrayListList<List<int>>ListListboolintListList

List<List<int>> intList = new List<List<int>>();
List<int> ints = new List<int>();

ints.Add(12345);
intList.Add(ints);
Console.WriteLine(intList[0].Count); //intList[0].Count is 1

ints.Clear();
Console.WriteLine(intList[0].Count); //intList[0].Count is 0

上記の例では、intsコレクションは単にに「マッピング」されてintList[0]いるようです。したがって、コレクション自体を変更すると、同じオブジェクトであるため、intsも変更されます。intList[0]これは、次の例とは対照的です。

List<bool> boolList = new List<bool>();
bool bigBool = false;

boolList.Add(bigBool);
Console.WriteLine(boolList[0]); //boolList[0] is false

bigBool = true;
Console.WriteLine(boolList[0]); //boolList[0] is...still false??

上記の例では、にマップされるのではなく、にboolList[0]コピーbigBoolされているようboolList[0]です。のコピーもそうboolList[0]ですbigBool、そしてそれらは2つの別々のオブジェクトです。

List<T>.Addだから私の質問は:どのタイプが追加されているかに応じて、なぜの2つの別々の機能があるように見えるのListですか?MSDNを確認しましたが、この動作についての言及は見つかりませんでした。ありがとう。

4

2 に答える 2

8

オブジェクトの種類によって異なります。

値型がコピーされます。参照型では、参照が使用されます。

DateTimeたとえば、整数(ブール値)は値型(構造体は値型)でありstringList<T>は参照型(クラスは参照型)です。

詳細については、MSDNの値型と参照型を参照してください。

于 2013-01-20T22:13:29.317 に答える
2

平等のように考えてください。同じように。

var added = myObject;

オブジェクトが値型(数値など)である場合、またはオブジェクトが不変である場合(など)、オブジェクトはstringコピーされます。ほとんどすべてのクラスインスタンスのように、それが不変の参照型である場合は、同じオブジェクトインスタンスへの別の参照を取得するだけです。

完全なMSDNリファレンスについては、以下を参照してください。

于 2013-01-20T22:15:06.613 に答える