【发布时间】:2015-02-04 18:41:14
【问题描述】:
据我所知,在 C# 中,方法调用期间参数的传递是按值传递的。但是当您使用对象作为参数时,您传递的是对象本身的引用。这意味着,如果您访问(和修改)对象内的字段值,则在方法调用完成后也会看到更新。
因此,如果我在方法中修改 String 的值,则应该在方法调用终止时对其进行修改(因为 String 在 C# 中是一个对象)。但这不是真的,事实上如果我写:
public static void main (String []args){
String s= "hello";
method(s);
System.Console.Writeline(s);
}
public void method (String s)
{s = "world";}
它将打印“hello”,而不是“world”。打印“world”的唯一方法是在方法签名中添加关键字ref并调用。
为什么会这样?我的答案(我希望您确认或更正)是在 C# 中 String 对象是不可变的,所以如果我让 s="world" 实际上编译器正在创建一个新的字符串对象,但是对对象 String s 的引用不会改变(因为段落是按值计算的)。
事实上,如果我在method()调用之前和之后打印s.getHashCode(),这两个值是不同的。
你觉得我的解释怎么样?
【问题讨论】:
-
该方法创建了一个指向内存中相同空间的新变量。您正在更改
method中的变量以指向其他内容,而不是main中的变量。
标签: c# pass-by-reference pass-by-value