C#的克隆方法

在JAVA中有SerializationUtils.clone 通常用于深拷贝对象。Java 中的 SerializationUtils.clone 是 Apache Commons Lang 库中的一个工具类,它通过序列化和反序列化来实现对象的深拷贝。虽然 C# 没有直接等价的 SerializationUtils.clone 方法,但你可以使用多种方法来实现类似的功能,例如一下方法。

使用Json.NET

方法简单,性能高,安全性高,示例如下。
1.先安装Newtonsoft.Json
2.使用

using Newtonsoft.Json;

public static class SerializationUtils
{
   public static T Clone<T>(T obj)
   {
       if (obj == null) return default(T);

       // 将对象序列化为 JSON 字符串
       string json = JsonConvert.SerializeObject(obj);
       // 将 JSON 字符串反序列化为新的对象
       return JsonConvert.DeserializeObject<T>(json);
   }
}

使用System.Text.Json

System.Text.Json也是深拷贝,使用方法如下。

using System.Text.Json;

public static class SerializationUtils
{
   public static T Clone<T>(T obj)
   {
       if (obj == null) return default(T);

       // 将对象序列化为 JSON 字符串
       string json = JsonSerializer.Serialize(obj);
       // 将 JSON 字符串反序列化为新的对象
       return JsonSerializer.Deserialize<T>(json);
   }
}

使用 ICloneable 接口(浅拷贝或自定义深拷贝)

C# 提供了 ICloneable 接口,允许你实现对象的克隆。然而,默认的 Clone 方法只提供浅拷贝(即只复制引用类型的第一层),如果你需要深拷贝,必须手动实现。

public class MyClass : ICloneable
{
   public int Id { get; set; }
   public List<string> Items { get; set; }

   public object Clone()
   {
       // 手动实现深拷贝
       return new MyClass
       {
           Id = this.Id,
           Items = new List<string>(this.Items) // 深拷贝列表
       };
   }
}

// 使用示例
MyClass original = new MyClass { Id = 1, Items = new List<string> { "A", "B" } };
MyClass clone = (MyClass)original.Clone();

使用 MemberwiseClone(浅拷贝)

MemberwiseClone 是 C# 中的一个受保护的方法,用于创建对象的浅拷贝。它只会复制对象的字段,而不会递归地复制引用类型的对象。因此,它不适合深拷贝。

public class MyClass
{
   public int Id { get; set; }
   public List<string> Items { get; set; }

   public MyClass ShallowClone()
   {
       return (MyClass)this.MemberwiseClone();
   }
}

// 使用示例
MyClass original = new MyClass { Id = 1, Items = new List<string> { "A", "B" } };
MyClass shallowClone = original.ShallowClone();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hh_fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值