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