首页 > 解决方案 > 在具有相同 ref 变量的连续调用方法上实现 ref 功能

问题描述

我以以下方式使用了 ref 。那么当在第 5 种方法中创建一个新对象时,访问是否会一直到 main 方法中的原始 emp 并在那里创建一个新对象?如果是的话,有没有一种方法可以在没有太多迭代的情况下实现相同的功能,即它应该在第 5 个方法本身中创建一个新对象,并且更改也应该反映在主要方法的 emp 中?

public static void Main(string[] args)
        {
            Employee emp=new Employee();
            emp.id=10;
            Program p=new Program();
            p.Method1(ref emp);
            Console.WriteLine(emp.id);
            Console.ReadKey();
        }
public void Method1(ref Employee emp)
         {
             Method2(ref emp);
         }
         public void Method2(ref Employee emp)
         {
             Method3(ref emp);
         }
         public void Method3(ref Employee emp)
         {
             Method4(ref emp);
         }
         public void Method4(ref Employee emp)
         {
             Method5(ref emp);
         }
         public void Method5(ref Employee emp)
         {
             emp=new Employee();
             emp.id=20;
         }

标签: c#ref

解决方案


是否访问一直到 main 方法中的原始 emp 并在那里创建一个新对象

它不会在那里创建对象,但是它会覆盖对该对象的引用,它会在创建对象的位置创建对象

如果是的话,有没有一种方法可以在没有太多迭代的情况下实现相同的功能

什么迭代?毕竟你做了所有的传递

它应该在第 5 个方法本身中创建一个新对象,并且更改也应该反映在主要方法的 emp 中?

它已经这样做了,除了它不会更改原始员工之外,它会覆盖它的位置。

Console.WriteLine(emp.id);
// writes 20

想象一下,您制作了一个馅饼并将其放入容器中。

  1. 您将容器传递给 Bob
  2. 谁把容器递给吉姆
  3. 最终传给了乔。

然后乔决定自己做馅饼并将其放入容器中,您原来的馅饼消失在以太中。

此时没有原始对象,容器现在包含新派

当您通过引用传递一个对象时,您传递的是一个指向存储在内存中的数据的引用,如果有人选择覆盖该引用,那就是它,拥有该引用的每个人都会获得新的覆盖。


在这一点上,现在你需要做一些研究并阅读文档,问你的老师你的朋友,做你需要做的任何事情。然而,问这种类型的问题是多余的,当你编写一个程序时,你会花 15 年时间问一些基本问题,你可以通过阅读来解决这些问题

请从这里开始

参考(C# 参考)

当在方法的参数列表中使用时,ref 关键字表示参数是通过引用而不是值传递的。引用传递的效果是被调用方法中参数的任何改变都会反映在调用方法中。例如,如果调用者传递了一个局部变量表达式或数组元素访问表达式,并且被调用的方法替换了 ref 参数所引用的对象,那么调用者的局部变量或数组元素现在在该方法时引用了新对象返回。


推荐阅读