当前位置: 首页 > news >正文

关于地址引用与值引用的坑

List<UserInfo> userInfoList = new List<UserInfo>();
List<UserInfo> userInfoList_new = new List<UserInfo>(userInfoList);

userInfoList_new 与userInfoList 指的是相同的内存吗?

答:

在C#中,userInfoList_new 和 userInfoList 都是列表引用,但它们指向的是不同的内存空间。这意味着如果你添加或删除一个列表中的元素,这将不会影响另一个列表。

然而,需要注意的是,尽管这两个列表本身位于不同的内存空间,但是它们包含的 UserInfo 对象仍然指向相同的内存地址。换句话说,这两个列表共享相同的对象。所以,如果你更改了其中一个列表中的某个 UserInfo 对象的属性,那么这个变化也会反映在另一个列表中。

例如:

List<UserInfo> userInfoList = new List<UserInfo>();
userInfoList.Add(new UserInfo { Name = "Alice" });List<UserInfo> userInfoList_new = new List<UserInfo>(userInfoList);
userInfoList_new[0].Name = "Bob";
Console.WriteLine(userInfoList[0].Name);  // This will output "Bob", not "Alice"

在这个例子中,我们更改了 userInfoList_new 中的第一个 UserInfo 对象的 Name 属性。因为 userInfoList 和 userInfoList_new 实际上指向同一个 UserInfo 对象,所以当我们打印出 userInfoList 中的第一个 UserInfo 对象的 Name 时,结果是 “Bob” 而不是 “Alice”。

如果你想创建 UserInfo 对象的深拷贝,那么你需要手动实现这一点,例如通过序列化和反序列化对象,或者在 UserInfo 类中实现 ICloneable 接口,并在需要的时候调用 Clone() 方法。

怎么才能实现修改userInfoList_new 中的第一个 UserInfo 对象的 Name 属性不会影响userInfoList 中的第一个 UserInfo 对象的 Name?

如果你想要在修改 userInfoList_new 中的对象时不影响 userInfoList 中的对象,你需要创建 UserInfo 对象的深拷贝。这通常可以通过实现 ICloneable 接口或者自定义一个复制方法完成。

以下是通过 ICloneable 接口实现深拷贝的示例:

public class UserInfo : ICloneable
{public string Name { get; set; }public object Clone(){return this.MemberwiseClone();}
}

然后,在创建新列表时,你需要为每个元素创建一个克隆:

List<UserInfo> userInfoList = new List<UserInfo>();
userInfoList.Add(new UserInfo { Name = "Alice" });List<UserInfo> userInfoList_new = new List<UserInfo>(userInfoList.Count);foreach(var userInfo in userInfoList)
{userInfoList_new.Add((UserInfo)userInfo.Clone());
}// Now you can modify userInfoList_new without affecting userInfoList
userInfoList_new[0].Name = "Bob";Console.WriteLine(userInfoList[0].Name);  // Outputs: Alice
Console.WriteLine(userInfoList_new[0].Name);  // Outputs: Bob

在这个例子中,我们首先创建了 userInfoList 并添加了一个 UserInfo 对象,然后我们创建了 userInfoList_new,并为 userInfoList 中的每个元素添加了一个克隆。之后,我们可以修改 userInfoList_new 中的对象而不会影响 userInfoList 中的对象。

http://www.lryc.cn/news/307498.html

相关文章:

  • 初谈软件工程(一)
  • 自动化开展思路
  • 安装使用zookeeper
  • nginx实现http反向代理及负载均衡
  • vue组件中data为什么必须是一个函数
  • 科技论文编写思路
  • Windows虚拟机克隆后修改SID
  • 前端架构: 脚手架工具rxjs的快速上手应用
  • 小程序框架(概念、工作原理、发展及应用)
  • 音视频数字化(数字与模拟-电影)
  • 在 Ubuntu 中, 使用 fsck 命令来修复磁盘文件系统
  • LED电子显示屏连接方式解析
  • Mysql运维篇(五) 部署MHA--主机环境配置
  • Offer必备算法09_分治快排_四道力扣OJ(快排三路划分)
  • Linux下性能分析的可视化图表工具
  • 泽攸科技JS系列高精度台阶仪在半导体领域的应用
  • c++实现栈和队列类
  • MySQL优化之索引下推
  • 【Java程序设计】【C00338】基于Springboot的银行客户管理系统(有论文)
  • C语言中大小写字母的转化
  • Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案
  • 红队打靶:DR4G0N B4LL打靶思路详解(vulnhub)
  • SQL Server添加用户登录
  • pytest如何在类的方法之间共享变量?
  • 配置前端项目到 github-pages
  • VSCode使用教程
  • vscode——本地配置(C和C++环境配置)(2)
  • 【从零开始学习重要知识点 | 第一篇】快速了解什么是幂等性以及常见解决方案
  • Jvm之内存泄漏
  • 尚硅谷webpack5笔记2