在下面的示例中,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
答案 0 :(得分:10)
是
收藏品是可变的。字符串是不可变的。因此,在开头A
和B
是对两个不同列表的引用。执行B = A
后,B
和A
会在内存中引用相同的列表,因此对一个列表的更改会反映在另一个列表中。
但是字符串是不可变的,因此+=
运算符实际上返回一个新字符串。所以在开始时你实际上在这里有相同的情况,s1
和s2
指向内存中的相同字符串,但s2 += "TEST"
将导致分配新字符串并{{1}将改为引用那个。
答案 1 :(得分:4)
你完全错了:你只是将lazy var panRecognizer : UIPanGestureRecognizer = {
return UIPanGestureRecognizer(target:self, action:"detectPan:")
}()
引用的对象设置为ListA
引用。也就是说,现在ListB
是ListB
。因此,您始终在修改ListA
。
显然,除非您使用immutable collections或read-only collections,否则收藏品是可变的。
答案 2 :(得分:2)
您已使用代码示例回答了自己的问题。除非你使用immutable collection,否则集合是可变的。更改A
和B
引用的列表,列表本身会更改,而不是创建新列表。
字符串是不可变的。因此s2 += "TEST";
会创建一个新字符串,该字符串将分配给s2
。此时,s1
和s2
引用不同的字符串。
答案 3 :(得分:1)
考虑以下示例: -
此处输出为:
<强> ABC 强>
<强> 123ABC 强>
现在,取消注释注释行 s1 =“XXX”并运行代码。 现在,输出将是:
<强> XXX 强>
<强> 123ABC 强>
在此观察到,即使在改变s1的值之后,s2的结果也没有改变。它描述了s1不是指与s2相同的对象。或者换句话说,当我们声明 s2 + = s1 时,会创建一个新字符串。 因此,我们可以说String是不可变的。
现在,看看以下带有集合的示例:
输出将是:
L2:a
现在,从示例中取消注释注释的代码行并查看输出。
输出将是:
L2:a
L2:c
这表明l1和l2现在引用同一个对象,这意味着没有创建新对象,这与string的情况不同。 因此,集合是可变的。