【问题标题】:ref functionality implementation on continuously called methods with the same ref variable具有相同 ref 变量的连续调用方法上的 ref 功能实现
【发布时间】:2019-01-17 04:56:17
【问题描述】:

我以下列方式使用了 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;
         }

【问题讨论】:

  • 你尝试的时候发生了什么?我的意思是,您已经拥有代码。
  • @mjwills 我想知道代码在这个特定场景中是如何在内部工作的,以及我是否可以在不使用 ref 关键字的情况下复制这个场景!

标签: c# ref


【解决方案1】:

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

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

如果是的话,有没有一种方法可以让我实现相同的功能,而无需 这么多迭代

什么迭代?毕竟你做了所有的路过

它应该在第 5 种方法本身中创建一个新对象以及更改 也应该体现在main方法的emp中?

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

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

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

  1. 您将容器传递给 Bob
  2. 谁将容器交给 Jim
  3. 最终传给乔。

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

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

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


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

请从这里开始

ref (C# Reference)

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

【讨论】:

  • 感谢您的回答和建议。我其实也有同样的想法,但有点困惑!
猜你喜欢
  • 2019-03-26
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多