我知道string是一个引用类型,当你将一个引用类型发送给一个函数时,如果你改变它的值,原始对象的值将会改变,但是为什么当我调用change函数时原始字符串保持不变。但是当我有一个类的对象并将其发送到函数时,它的原始值将会改变。这是一个例子:
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";
}
输出是"嗨"而不是"测试"对于字符串,但对于Test对象,它是"测试"
答案 0 :(得分:4)
它不仅仅是字符串,您还无法将对象更改为新对象,即这不会起作用:
static void Change(ClassA aObj)
{
aObj = new ClassA(); // Won't hold when you leave the function
}
原因是您通过值传递这些参数的引用。这意味着你可以看到并弄乱那里的东西,但你无法改变它以指向内存中的新参考插槽。
要解决此问题,您需要使用ref
/ out
个关键字。
有关更详细的说明,请阅读this。
答案 1 :(得分:1)
因为您正在更改传入的参数的值,而不是原始值。
即。当您传递str
时,x
会成为x
的副本。更改此内容对.set
中存储的值没有任何影响。
编辑:好的,这是一个过于简化的解释,但正如所指出的,已有更好的解释。 Tim是正确的,字符串是不可变的,所以你不能改变存储在该引用中的字符串的内容,你只能用新的字符串替换它,但除非你专门指定参数为'ref',否则你不能更改方法内的引用。
答案 2 :(得分:0)
尝试使用关键字csh
传递字符串:
#!/bin/sh
tcsh -ef realscript.csh
答案 3 :(得分:0)
当您调用Change(string str)方法时,将创建一个新引用(变量)并为其赋值x,该值将作为参数传递。当在方法中改变str时,x不受影响,因为它们是两个分离的引用。
尝试更改(ref string str)
答案 4 :(得分:0)
首先,字符串是不可变的。他们无法改变。其次,您通过“reference”传递此字符串,因为string是引用类型。分配方法参数不会更改引用的值,它只会更改此字符串的值。您可以使用ref
来引用字符串位置而不是其值。
public void Change(ref string str)
{
str = "New String";
}