【发布时间】:2017-02-22 00:47:05
【问题描述】:
我正在阅读 John Skeet 的书 "C# in Depth"。他在第 74 页上说,每个人都假设通过引用传递给函数的参数,同时它是通过值传递的,并且作为示例,他展示了这段代码,该代码必须证明调用代码中的 StringBuilder 没有改变。与此同时,我们的函数 StringBuilder 实例内部发生了变化。
private static void SayHello(StringBuilder s)
{
s.AppendLine("Hello");
}
但我的实验表明 StringBuilder 对象发生了变化——我们将在控制台中看到“Hello”。这里有什么问题?或者我对这个例子的理解有什么问题?
private static void Main(string[] args)
{
var s = new StringBuilder();
Console.WriteLine(s.ToString());
SayHello(s);
Console.WriteLine(s.ToString());
Console.ReadLine();
}
private static void SayHello(StringBuilder s)
{
s.AppendLine("Hello");
}
【问题讨论】:
-
我不想让你感到惊讶,但没有人在第 74 页上打开过 C# 深度。StringBuilder 是引用类型。告诉我们哪些段落让您感到困惑。
-
s.ToString() 在每次调用时都会为您提供一个新的字符串对象。 s StringBuilder 引用在整个示例中保持不变。
-
你把object的地址传给另一个方法,结果被修改了,你期待什么?
-
@Timeless,我期待引用对象的行为,而不是 John 书中解释的值对象行为。这就是我问这个问题的原因。
标签: c# pass-by-value byval