字符串未被引用更改

Meh*_*eli -2 .net c# asp.net string reference

我创建2个变量的名称与一个b然后我初始化变量一个有值"开始",后来我给你变一个变量b,最后我改变变量的值,年底,但变量b不改变,而一个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!!
Run Code Online (Sandbox Code Playgroud)

为什么这不按预期工作?

Eri*_*ert 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是现在同一抽屉两个不同的名字."

那有意义吗?

  • @gdoron:不变性与它有什么关系?假设我们用"var a = new [] {1,2,3}替换了用户的问题; var b = a; a = new [] {4,5,6};" 嘿,b没有改变,即使a和b都是参考类型.就此而言,按价值比较与什么有关?问题是关于通过引用复制的性质,而不是关于不变性或比较. (5认同)

kpr*_*bst 6

这不是字符串在C#中的工作原理,它们不是指针.更重要的是,字符串是不可变的,所以你无论如何都不能改变它们的值,只需分配一个新的.所以无论你想做什么,你都需要考虑到这一点.

比较运算符成功的事实是因为你在每个字符串中包含的字符之间进行字面比较,而不是因为它们在内存存储意义上"相等".

  • 这种比较是有效的,因为C#覆盖了运算符http://msdn.microsoft.com/en-us/library/aa664728(v=vs.71).aspx,但你实际上有点说. (2认同)
  • 这里没有比较. (2认同)