为啥调用函数后字符串值保持不变[重复]

Posted

技术标签:

【中文标题】为啥调用函数后字符串值保持不变[重复]【英文标题】:Why string value remains unchanged after calling function [duplicate]为什么调用函数后字符串值保持不变[重复] 【发布时间】:2015-11-11 11:23:17 【问题描述】:

据我所知,字符串是一个引用类型,当你将一个引用类型发送给一个函数时,如果你改变它的值,原始对象的值就会改变,但是为什么当我调用 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";
    

字符串的输出是“Hi”而不是“Test”,但对于Test对象它是“Test”

【问题讨论】:

字符串是不可变的 @TimSchmelter 是的,但这不是这个特定问题的答案。 @TheodorosChatzigiannakis:这不是答案,而是评论。 OP 想要修改他传递给方法的字符串。那是行不通的。答案可能是前者修改了局部变量(参数),而后者修改了具有字符串属性的对象。对象是可变的。 @TimSchmelter 我的意思是,如果 OP 通过 ref string 而不是 string,结果将是他/她所期望的。所以不变性不是主要问题。 @TimSchmelter 你混合了两个不同的概念。引用类型与“引用调用”无关。当您覆盖变量(不变异)时,引用类型无关紧要。重要的是,它是作为值传递还是作为引用传递。在这种情况下,它作为值传递(即不是由ref x 【参考方案1】:

因为您正在更改传入参数的值,而不是原始值。

str 成为 x 的副本,当您传入时。更改这对存储在 x 中的值没有影响。

编辑:好的,这是一个过于简化的解释,但正如所指出的,已经有了更好的解释。蒂姆是对的,字符串是不可变的,所以你不能改变存储在那个引用中的字符串的内容,你只能用一个新的替换它,但是除非你特别指定参数为'ref',否则你不能更改方法内的引用。

【讨论】:

字符串是引用类型,因此我传递的是引用而不是值 这个问题已经在 SO 上被问过多次。使用谷歌。一个例子是:***.com/questions/1069155/… 但是是不可变的引用类型,字符串是特殊的,因为有些API函数允许你传递null。 弗林 的意思 (现在有点不准确)是您需要更改方法实现中字符串引用本身指向的内容 - 只有通过按引用引用字符串(添加ref 关键字)而不是按值引用,这是默认值。 谢谢,现在有意义了。【参考方案2】:

首先,字符串是不可变的。他们无法改变。其次,您通过“引用”传递了这个字符串,因为字符串是一种引用类型。分配方法参数不会改变引用的值,它只会改变这个字符串的值。您可以使用ref 来引用字符串位置而不是其值。

public void Change(ref string str)

    str = "New String";

【讨论】:

【参考方案3】:

当您调用 Change(string str) 方法时,会创建一个新的引用(变量)并为其分配作为参数传递的 x 的值。当 str 在方法中更改时 x 不受影响,因为它们是两个单独的引用。

尝试更改(参考字符串 str)

【讨论】:

【参考方案4】:

这不仅仅是字符串,您也无法将对象更改为新对象,也就是说,这是行不通的:

static void Change(ClassA aObj) 

    aObj = new ClassA(); // Won't hold when you leave the function

原因是您通过值传递这些参数的引用。这意味着您可以看到并弄乱那里的内容,但您无法将其更改为指向内存中的新参考槽。

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

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

【讨论】:

【参考方案5】:

尝试使用关键字ref 传递字符串:

static void Change(ref string str)

    str = "Test";

【讨论】:

我知道这会起作用,我的问题是为什么没有 ref 不起作用

以上是关于为啥调用函数后字符串值保持不变[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中定义的persistent变量为啥会显示两种颜色?

调用 setState 后 ReactJS 元素未更新

为啥在按值返回时总是调用复制构造函数

调用函数时为啥形参的值不能传给实参

可以在严格模式下使用字符串值调用函数吗[重复]

为啥总是调用超类构造函数[重复]