为什么调用函数后字符串值保持不变
本文关键字:字符串 调用 函数 为什么 | 更新日期: 2023-09-27 18:08:43
我知道字符串是一个引用类型,当你发送一个引用类型给一个函数时,如果你改变它的值,原始对象的值将会改变,但是为什么当我调用改变函数时,原始字符串保持不变。但是当我有一个类的对象并将其发送给函数时,它的原始值将会改变。下面是一个例子:
static void Main(string[] args)
{
string x = "Hi";
Change(x);
Console.WriteLine(x);
var y = new Test();
y.Str = "Hi";
Change(y);
Console.WriteLine(y.Str);
Console.ReadKey();
}
static void Change(string str)
{
str = "Test";
}
static void Change(Test x)
{
x.Str = "Test";
}
对于字符串,输出是"Hi"而不是"Test",但是对于测试对象,输出是"Test"
这不仅仅是字符串,你也不能将对象更改为新对象,也就是说,这将不起作用:
static void Change(ClassA aObj)
{
aObj = new ClassA(); // Won't hold when you leave the function
}
原因是您正在按值传递这些形参的引用。这意味着你可以看到和打乱那里的东西,但你不能改变它指向内存中的一个新的引用槽。
为了解决这个问题,需要使用ref
/out
关键字。
>
因为您更改的是传入参数的值,而不是原始值
。当你传入str
时,它变成了x
的副本。
x
存储的值没有影响。编辑:好吧,这是一个过于简化的解释,但正如所指出的,更好的解释已经存在。Tim是对的,字符串是不可变的,所以你不能改变存储在引用中的字符串的内容,你只能用一个新的替换它,但是除非你特别指定参数为'ref',否则你不能改变方法中的引用。
尝试用关键字ref
:
static void Change(ref string str)
{
str = "Test";
}
当您调用Change(string str)方法时,将创建一个新的引用(变量)并将x的值作为参数传递。当str在方法中改变时,x不受影响,因为它们是两个独立的引用。
Try Change(ref string str)
首先,字符串是不可变的。他们无法改变。第二,你通过"引用"传递这个字符串,因为字符串是一个引用类型。给方法参数赋值不会改变引用的值,它只会改变这个字符串的值。您可以使用ref
来引用字符串的位置,而不是它的值。
public void Change(ref string str)
{
str = "New String";
}