我创建2个名称 a 和 b 的变量然后我初始化变量 a ,其值为 “start” ,之后我将变量 a 分配给变量 b ,最后 我将变量 a 的值更改为 结束 ,但变量 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!!
为什么这不按预期工作?
答案 0 :(得分:18)
你误解了“参考类型”的含义。
以这种方式思考。想象一下两座房子,一座位于芝麻街123号,一座位于Pennyslvania大街1600号。那些是引用类型的对象。
现在想象你有两张纸。一个人说“123芝麻街”。一个人说“1600宾夕法尼亚大道”。那些不是房子;你无法进入那些纸张。这些是引用到房屋。
现在想象你有两个标有“a”和“b”的抽屉。那些是参考类型的变量。
你把“123 Sesame Street”纸放入抽屉“a”。你不要将房子放入抽屉里。您将参考放入抽屉中。引用类型的变量存储对象的引用。这就是为什么它被称为引用类型的变量。
然后你在抽屉里写一张纸的复印件“a”并把它放在抽屉里“b”。 “b”现在包含参考的副本。抽屉“a”和“b”现在指的是同一个房子。如果你把那栋房子漆成红色,那么两个抽屉里的纸张所指的房子都是红色的,因为这两个房子只提到了一个房子。有两个引用同一个房子,两个变量包含一个引用。
然后你从抽屉里取出纸张“a”并将其摧毁。你用“宾夕法尼亚大道1600号”的纸张替换它。
这样做并没有改变任何关于抽屉“b”的东西!当你说“b = a”时,这意味着“制作抽屉a中的参考复印件并将其放入抽屉b”。 不意味着“抽屉a和b现在是同一抽屉的两个不同名称”。
这有意义吗?
答案 1 :(得分:6)
这不是字符串在C#中的工作原理,它们不是指针。更重要的是,字符串是不可变的,所以你无论如何都不能改变它们的值,只需分配一个新的。所以无论你想做什么,你都需要考虑到这一点。
比较运算符成功的事实是因为你在每个字符串中包含的字符之间进行字面比较,而不是因为它们在内存存储意义上是“相等的”。
答案 2 :(得分:1)
如果确实需要通过引用(通过函数)更改字符串,可以将ref
放在参数类型的左侧。否则,您可以创建一个MutableString
类,但我个人不需要可变字符串。
您也可以尝试StringBuilder
,但这不是真正的字符串。