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

本文关键字:字符串 调用 函数 为什么 | 更新日期: 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";
}