集合是否可变?

时间:2015-11-20 09:58:55

标签: c# collections

在下面的示例中,List B中所做的更改直接反映在List A中。

   List<string> A = new List<string>();
   A.Add("1");
   List<string> B = new List<string>();
   B = A;
   foreach (string value in B)
   {
       Console.WriteLine("B= " + value);
   }
   B.Add("2");
   foreach (string value in A)
   {
       Console.WriteLine("A= " + value);
   }

输出

  

B = 1

     

A = 1

     

A = 2

即使我使用Arraylist,输出也是一样的。

如果是字符串,则行为是其他行为!

String s1 = "abc";
String s2 = s1;
s2 += "TEST";
Console.WriteLine("S1=" + s1 + "    S2=" + s2);

输出

  

S1 = abc S2 = abcTEST

4 个答案:

答案 0 :(得分:10)

收藏品是可变的。字符串是不可变的。因此,在开头AB是对两个不同列表的引用。执行B = A后,BA会在内存中引用相同的列表,因此对一个列表的更改会反映在另一个列表中。

但是字符串是不可变的,因此+=运算符实际上返回一个新字符串。所以在开始时你实际上在这里有相同的情况,s1s2指向内存中的相同字符串,但s2 += "TEST"将导致分配新字符串并{{1}将改为引用那个。

答案 1 :(得分:4)

你完全错了:你只是将lazy var panRecognizer : UIPanGestureRecognizer = { return UIPanGestureRecognizer(target:self, action:"detectPan:") }() 引用的对象设置为ListA引用。也就是说,现在ListBListB。因此,您始终在修改ListA

显然,除非您使用immutable collectionsread-only collections,否则收藏品是可变的。

答案 2 :(得分:2)

您已使用代码示例回答了自己的问题。除非你使用immutable collection,否则集合是可变的。更改AB引用的列表,列表本身会更改,而不是创建新列表。

字符串是不可变的。因此s2 += "TEST";会创建一个新字符串,该字符串将分配给s2。此时,s1s2引用不同的字符串。

答案 3 :(得分:1)

考虑以下示例: -

enter image description here

此处输出为:

<强> ABC

<强> 123ABC

现在,取消注释注释行 s1 =“XXX”并运行代码。 现在,输出将是:

<强> XXX

<强> 123ABC

在此观察到,即使在改变s1的值之后,s2的结果也没有改变。它描述了s1不是指与s2相同的对象。或者换句话说,当我们声明 s2 + = s1 时,会创建一个新字符串。 因此,我们可以说String是不可变的。

现在,看看以下带有集合的示例:

enter image description here

输出将是:

L2:a

现在,从示例中取消注释注释的代码行并查看输出。

输出将是:

L2:a

L2:c

这表明l1和l2现在引用同一个对象,这意味着没有创建新对象,这与string的情况不同。 因此,集合是可变的。