C#的string类型 是引用类型吗,为什么不能在函数中改变字符串的值

public static void Main(string[] s)
{
string str = "123";

Console.WriteLine(str);//输出123
ChangeString(str);
Console.WriteLine(str);//输出123
}

public static void ChangeString(string s)
{
s = "HaHa";
}

上面的代码,如果string是引用类型的话,传递的是一个引用,那么

因为在C#里string对象是不变对象,假设有string str1="abc";那么如果存在有这么一条语句对str1进行再次赋值 如str1="123",那么,此时指向str1的栈的地址并未发生改变,而是在托管堆里重新创建一个新的对象,其值为123,而str1的栈指向托管堆里123的地址,而原先的abc即将会被垃圾回收机制清理掉。所以ChangeString函数里对形参s赋值过程是这样子的:形参s首先也指向了abc,但在函数体里s又被指向了HaHa,那么此时是s改变了指向,而实参str并没有改变它原来的指向abc. 所以要想在函数里改变实参的值必须用ref,除对象和集合外。
static void Main(string[] args)
        {
            string str = "123";
            Console.WriteLine(str);
            ChangeString(ref str); // 使用ref引用型,形参则可以改变实参的值
            Console.WriteLine(str);
            Console.ReadKey();
        }
        public static void ChangeString(ref string s) // 加ref,形参可以更改实参的值
        {
            s = "HaHa";
        }

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-14
ChangeString是静态无返回值过程,你希望他做什么?本身的str 值并没有改变,输出当然一样!如果要改变输出值的话,就要定义一个返回值的方法:
string ChangeString(string s){s = "HaHa";return s;}如果s为固定值,则传值变得无意义?!
如果改为:
string ChangeString(string s){s += "HaHa";return s;}则还有意义可言。
另外,如果是无返回值方法则把显示语句直接写入该方法中就可以了。
public static void ChangeString(string s)
{
s += "HaHa";
Console.WriteLine(s);//输出123
}
第2个回答  2014-03-14
String的确是引用类型,
因此,当把一个字符串变量赋给另一个字符串变量时,会得到对内存中同一个字符串的两个引用。
但是,string 与引用类型在常见的操作上有一些区别。修改其中一个字符串时,就会创建一个全新的string对象,而另一个字符串没有改变。
参考《C#高级编程第六版》2.4.4节
第3个回答  2014-03-14
string 确实是引用类型 但是要改变字符串的值
请使用public static void ChangeString(ref string s)

字符串和普通的引用类型不一样 每赋值一次 就新开辟一个空间,类似于int,因此值并没有改变。

不理解的话 你就这样记:string 虽然是引用类型 但是改变值要和int一样使用 加ref 或 out本回答被网友采纳
相似回答