字符串未通过引用更改
本文关键字:引用 字符串 | 更新日期: 2023-09-27 18:21:59
我创建了两个名为a和b的变量,然后用值"start"//strong>初始化变量>a,然后将变量a[/strong>分配给变量>b,最后我将变量a的值更改为end,但变量b[/strong>不变,而a和b是引用类型!
string a = "start"; // Declare and initialize a variable
string b = a; // Copy the variable's value to a new variable
a = "end"; // Modify the value of the original variable
//variable b don't change!!
为什么这没有按预期工作?
您误解了"引用类型"的含义。
这样想吧。想象一下两栋房子,一栋在芝麻街123号,另一栋在宾夕法尼亚大道1600号。这些是引用类型的对象。
现在想象你有两张纸。其中一条写着"芝麻街123号"。其中一条写着"宾夕法尼亚大道1600号"。那些不是房子;你不能靠近那些纸片。这些是对房屋的引用。
现在想象一下,你有两个标有"a"answers"b"的抽屉。这些是引用类型的变量。
你把"芝麻街123号"的纸放进抽屉"a"里。你不能把房子放进抽屉里。你把房子的参考放进抽屉里。引用类型的变量存储对对象的引用。这就是为什么它被称为引用类型的变量。
然后你把"a"抽屉里的纸复印一下,放在"b"抽屉里。"b"现在包含引用的副本。抽屉"a"answers"b"现在指的是同一栋房子。如果你把那所房子漆成红色,那么两个抽屉里的文件所指的房子就是红色的,因为两份文件都只指一所房子。同一栋房子有两个引用,两个变量各包含一个引用。
然后你把纸从抽屉"a"里拿出来销毁,换上写着"宾夕法尼亚大道1600号"的纸。
这样做并没有改变抽屉"b"的任何东西!当你说"b=a"时,意思是"复印a抽屉里的参考资料,放在b抽屉里"。它不是指"抽屉a和b现在是同一抽屉的两个不同名称"。
这有道理吗?
字符串在C#中不是这样工作的,它们不是指针。更重要的是,字符串是不可变的,所以无论如何都不能更改它们的值,只需分配一个新值即可。所以无论你想做什么,你都需要考虑到这一点。
比较运算符之所以成功,是因为您正在对每个字符串中包含的字符进行文字比较,而不是因为它们在内存存储意义上"相等"。
如果确实需要通过引用(通过函数)更改字符串,可以将ref
放在参数类型的左侧。否则,您可以创建一个MutableString
类,但我个人并不需要可变字符串。
您也可以尝试StringBuilder
,但这并不是真正的字符串。