2015-08-18 15 views
-3

后保持不变据我所知字符串是引用类型,当你发送一个引用类型的功能,如果你改变它的价值,原始对象的值会发生变化,但为什么当我打电话更改功能原始字符串保持不变。但是当我有一个类的对象并将其发送给一个函数时,它的原始值将会改变。这里有一个例子:为什么字符串值保持调用函数

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”,而不是“测试”的字符串,但对测试对象是“测试”

+4

字符串是不可变的 –

+2

@TimSchmelter真的,但它不是这个特定问题的答案。 –

+0

https://msdn.microsoft.com/en-us/library/0f66670z.aspx – SquidScareMe

回答

1

因为你改变这是该参数的值通过了,而不是原来的价值。

str在您通过时成为x的副本。更改该值对存储在x中的值没有影响。

编辑:好吧,这是一个过于简单的解释,但指出,更好的解释已经上市。蒂姆的权利,字符串是不可变的,所以你不能改变存储在该引用中的字符串的内容,你只能用新的字符串替换它,但除非你明确指定参数为'ref',否则不能改变方法内的引用。

+0

字符串是引用类型,因此我通过的是一个引用而不是值 – EO102030

+2

这个问题已经在SO上多次提出。使用Google。一个例子是:http://stackoverflow.com/questions/1069155/is-string-a-value-type-or-a-reference-type – dotNET

+0

但是一个不可变的引用类型,字符串是特殊的,因为一些API函数允许你传递null。 –

0

尝试传递字符串与关键字ref

static void Change(ref string str) 
{ 
    str = "Test"; 
} 
+0

我知道这将工作,我的问题是为什么没有参考不起作用 – EO102030

3

这不只是字符串,你也无法改变的对象是新的对象,即,这是不行的:

static void Change(ClassA aObj) 
{ 
    aObj = new ClassA(); // Won't hold when you leave the function 
} 

的原因是,你是值传递这些参数的参考。这意味着你可以看到和弄乱那里的东西,但你不能改变它指向内存中的新参考插槽。

为了解决这个问题,你需要使用ref/out关键字。

如需更详细的解释,请阅读this

0

当调用变化(字符串str)方法一个新的参考(变量)被创建并分配其被作为参数传递的x的值。当方法改变时,x不受影响,因为它们是两个独立的引用。

Try Change(ref string str)

0

首先,字符串是不可变的。他们不能改变。其次,由于string是一个引用类型,所以你通过“引用”传递了这个字符串。赋值方法参数不会改变引用的值,它只会特别改变这个字符串的值。您可以使用ref来引用字符串位置而不是其值。

public void Change(ref string str) 
{ 
    str = "New String"; 
} 
相关问题