真的是有价值的传递吗?

这个问题在这里已经有了答案:

  • C#传递值与传递引用6个答案
  • 在C#7答案中通过引用或值传递对象

  • 阅读完页面后,他说的是这个。

    现在请记住,引用类型变量的值是引用,而不是对象本身。 您可以更改参数所引用的对象的内容,而不用通过引用传递参数。

        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

    上一篇: Is really argument passing by value?

    下一篇: C# pointer to the variable