Skip to content

C# 为什么 string 类型的参数在方法体内被修改不会影响到原来的变量值?

🏷️ C#

string 参数是直接传递原来变量的地址? 还是重新拷贝了一个字符串然后传递这个新字符串的地址?

应该是直接传递原来变量的地址, 这种情况又是如何实现改变字符串的值 但又不影响原来的变量?

是不是跟字符串的改变机制有关? 字符串的改变并不是直接在原来的堆地址上直接修改, 而是重新在堆上保存改变后的值.


string 类型是引用类型, 所以传递的是 string 类型的引用.

注意

常说的按引用传递其实是 以值传递的方式传递变量的引用, 并不是真正的按引用传递.

但是 string 的参数传递具有一些值传递的特性 (在方法体内改变变量值不会影响原来的值), 这是由于字符串类型的特殊性导致的.

  1. 字符串创建后不能再被改变;

  2. 改变字符串变量值时会创建新的字符串, 然后把变量指向新的地址, 原来的字符串并不会改变; 并且由于 字符串池机制, 之前的字符串并不会被释放;