C# 中的字符串引用

问题描述 投票:0回答:1

我有两个数组:

 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 但它给出了错误。

c# string reference
1个回答
1
投票

这里的技巧是理解变量和引用之间的区别。

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
引用的同一对象。

© www.soinside.com 2019 - 2024. All rights reserved.