真的是有价值的传递吗?
这个问题在这里已经有了答案:
阅读完页面后,他说的是这个。
现在请记住,引用类型变量的值是引用,而不是对象本身。 您可以更改参数所引用的对象的内容,而不用通过引用传递参数。
public static void Main()
{
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");
s = null;
}
//output will be Hello
当这个方法被调用时,参数值(对StringBuilder的引用)按值传递。 如果我要在方法中更改构建器变量的值(例如,使用语句生成器= null;),则调用者将看不到该更改,这与神话相反。
所以他几乎解释说你不能在SayHello中销毁对象StringBuilder
,你可以改变这个对象的内容。 我也不知道。
编辑:关于你的评论
所以,当你在SayHello中传递s
时,你会创建新的引用,并且在Main
方法和SayHello
都引用同一个对象。 但它们存在像2个不同的参考。
如果你写入
private static void SayHello(StringBuilder s)
{
s.AppendLine("Hello");
s = new StringBuilder();
}
SayHello
s的引用将指向另一个对象,但这不会改变Main方法中的任何内容,因为该引用指向您在其中编写Hello的前一个对象。 所以再次输出将是你好。
如果你想通过确切的参考你应该使用ref
所以,如果你写
private static void SayHello(ref StringBuilder s)
{
s.AppendLine("Hello");
s = null;
//you will receive an exception in Main method, because now the value in the reference is null.
}
考虑以下类比:
new StringBuilder()
你会得到一个键( s
授予您的访问)。 s.AppendLine
),你给他一份钥匙副本,以便他可以进入你的公寓并清理它。 这基本上是按照值传递引用类型时发生的情况。
现在考虑以下几点:
new StringBuilder()
你会得到一个键( s
授予您的访问)。 s.AppendLine
),你给他钥匙,以便清理你的公寓。 那就是当你通过引用传递一个引用类型时会发生什么。
链接地址: http://www.djcxy.com/p/21009.html