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

本文解释了在C#中,虽然userInfoList_new和userInfoList是列表引用,它们指向不同内存空间,但共享对象。若要修改一个不影响另一个,需实现深拷贝。通过ICloneable接口或自定义方法创建对象副本是关键。
摘要由CSDN通过智能技术生成
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 中的对象。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值