c# - 在具有相同 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;
}
解决方案
是否访问一直到 main 方法中的原始 emp 并在那里创建一个新对象
它不会在那里创建对象,但是它会覆盖对该对象的引用,它会在创建对象的位置创建对象
如果是的话,有没有一种方法可以在没有太多迭代的情况下实现相同的功能
什么迭代?毕竟你做了所有的传递
它应该在第 5 个方法本身中创建一个新对象,并且更改也应该反映在主要方法的 emp 中?
它已经这样做了,除了它不会更改原始员工之外,它会覆盖它的位置。
Console.WriteLine(emp.id);
// writes 20
想象一下,您制作了一个馅饼并将其放入容器中。
- 您将容器传递给 Bob
- 谁把容器递给吉姆
- 最终传给了乔。
然后乔决定自己做馅饼并将其放入容器中,您原来的馅饼消失在以太中。
此时没有原始对象,容器现在包含新派
当您通过引用传递一个对象时,您传递的是一个指向存储在内存中的数据的引用,如果有人选择覆盖该引用,那就是它,拥有该引用的每个人都会获得新的覆盖。
在这一点上,现在你需要做一些研究并阅读文档,问你的老师你的朋友,做你需要做的任何事情。然而,问这种类型的问题是多余的,当你编写一个程序时,你会花 15 年时间问一些基本问题,你可以通过阅读来解决这些问题
请从这里开始
当在方法的参数列表中使用时,ref 关键字表示参数是通过引用而不是值传递的。引用传递的效果是被调用方法中参数的任何改变都会反映在调用方法中。例如,如果调用者传递了一个局部变量表达式或数组元素访问表达式,并且被调用的方法替换了 ref 参数所引用的对象,那么调用者的局部变量或数组元素现在在该方法时引用了新对象返回。
推荐阅读
- regex - Zend 中的正则表达式电子邮件验证
- python - 为什么我在运行我的 python ping 脚本时收到主机未找到错误?
- ios - 如何在 iOS 中对图像实现 XMP 预设过滤器
- r - 如何编写一个函数来根据控制数据集在 R 中剪切许多列
- javascript - 检查包含文档中所有对象ID的数组字段中是否存在对象ID的最佳方法是什么?
- python - 调用 plt.subplot() 重置子图大小
- python - Pipenv 虚拟环境将我拉入不同的目录
- makefile - 如何从一个 GNU makefile 和大部分相同的源构建两个交互式网站?
- django - 按末端嵌套关系搜索 django rest 框架
- angular - 可以将 Angular 公开为 Web 服务 API 吗?