我有两个数组:
string[] arr1 = {"foo","bar","bazz"};
string[] arr2 = arr1;
public void changeArr(ref string[] a){
a[0] = "moo";
}
changeArr(ref arr2);
它正常工作,但对于字符串,我尝试做同样的事情
string str1 = "foo";
string str2 = str1;
public static void changeStr(ref string a){
a = "bar";
}
changeStr(ref str2);
但它只改变str2,因为我知道字符串是引用类型,所以str1和str2应该指向内存中的相同地址,并且changeStr()也应该改变str1。
我尝试删除 ref,因为它已经是 ref 类型,但它甚至没有改变 str2。我也尝试将 ref str1 传递给 str2 但它给出了错误。
这里的技巧是理解变量和引用之间的区别。
str1
和 str2
都引用相同的 "foo"
字符串对象,但它们仍然是不同的变量并且没有其他连接。如果将新对象分配给其中一个,则剩余变量仍引用原始对象。
在这种情况下,当将字符串
"bar"
分配给 a
时,您将一个 新字符串对象 分配给 a
变量,并且由于 str2
关键字,这包括 ref
变量。但 str1
仍然指向旧的 "foo"
对象。
类似地,考虑完全没有
ref
关键字的数组示例:
string[] arr1 = {"foo","bar","bazz"};
string[] arr2 = arr1;
public void changeArr(string[] a){
a[0] = "moo";
}
changeArr(arr2);
当此代码运行时,
arr1[0]
也会更改为"moo"
而不是"foo"
,即使没有ref
关键字。这是因为arr1
和arr2
设置为同一个数组对象,并且数组是引用类型。因此,在调用 chargeArr()
方法时,我们仍然向该方法传递对数组的引用,而不是复制整个数组。这是参考文献的副本,但它仍然是参考文献。即使我们更改了数组中的元素,它仍然是 arr1
引用的同一对象。