调用函数后为什么字符串值保持不变

时间:2015-08-18 13:29:51

标签: c#

我知道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对象,它是"测试"

5 个答案:

答案 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";
}