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

网站 linux 服务器潍坊网站建设SEO优化熊掌号

网站 linux 服务器,潍坊网站建设SEO优化熊掌号,衡水需要做网站的公司,西安网站建设昆奇在 .NET 中,深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy) 是对象复制的两种方式,它们的区别在于是否复制对象内部引用的其他对象。 浅拷贝(Shallow Copy) 定义: 浅拷贝创…

.NET 中,深拷贝(Deep Copy)浅拷贝(Shallow Copy) 是对象复制的两种方式,它们的区别在于是否复制对象内部引用的其他对象。


浅拷贝(Shallow Copy)

定义:

浅拷贝创建一个新对象,并将原对象的所有字段复制到新对象中。如果是值类型字段,直接复制其值;如果是引用类型字段,则只复制引用地址(指针),而不复制引用的对象本身。

特点:
  • 原始对象与副本共享引用类型的成员。
  • 修改其中一个对象的引用成员会影响另一个对象。
  • 通常速度快、开销小。
实现方式:
  • 使用 MemberwiseClone() 方法实现浅拷贝。
示例代码:
public object ShallowCopy()
{return this.MemberwiseClone();
}
图示说明:
OriginalPerson.Address ───┐├─ 指向同一个 Address 对象
CopyPerson.Address   ─────┘

深拷贝(Deep Copy)

定义:

深拷贝不仅复制对象本身,还会递归地复制对象所引用的其他对象,生成一个完全独立的副本。

特点:
  • 原始对象和副本之间没有共享的引用对象。
  • 修改副本不会影响原始对象。
  • 通常比浅拷贝更耗性能。
实现方式:
  1. 手动实现:为每个引用类型字段创建新实例。
  2. 序列化反序列化(如 System.Text.Json, Newtonsoft.Json 等)。
  3. 表达式树或反射生成器(如:第三方包 DeepCloner,FastDeepCloner 等)。
示例代码
  • 使用 JSON 序列化:
public Person DeepCopy()
{var json = JsonSerializer.Serialize(this);return JsonSerializer.Deserialize<Person>(json)!;
}
图示说明:
OriginalPerson.Address ───┐├─ 指向不同的 Address 对象(内容相同)
CopyPerson.Address   ─────┘

总结对比

特性浅拷贝深拷贝
引用对象复制不复制,仅复制引用复制,生成新对象
内存占用
性能较慢
修改互不影响否(修改引用对象会互相影响)是(完全独立)
典型实现方法MemberwiseClone()序列化、手动复制、第三方库

对象设计

设计一个 Person 类,里面包含了一个 Address 引用类型字段:

internal class Person
{public string Name { get; set; } = string.Empty;public int Age { get; set; }public Address Address { get; set; } = new();
}
  • ShallowCopy():复制了 NameAge 的值,但 Address 字段只是复制了引用。
  • DeepCopy() :完整复制整个对象图,包括 Address 实例。 .NET 9 推荐使用 System.Text.Json 或其他现代方式实现深拷贝。

📦 项目准备

  • .net 控制台项目信息
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><PublishAot>true</PublishAot><InvariantGlobalization>true</InvariantGlobalization></PropertyGroup><ItemGroup><PackageReference Include="Datadog.Trace.BenchmarkDotNet" Version="2.61.0" /><PackageReference Include="System.Text.Json" Version="9.0.6" /></ItemGroup></Project>
  • 创建一个 Person 对象,分别实现对象的深拷贝和浅拷贝方
using System.Text.Json;namespace BenchmarkTest.examples.Copy;// 创建一个包含深拷贝和浅拷贝方法的类
public class Person
{public string Name { get; set; } = string.Empty;public int Age { get; set; }public Address Address { get; set; } = new();// 浅拷贝public object ShallowCopy() => this.MemberwiseClone();// 深拷贝 (使用 System.Linq.Expressions 手动实现)public Person DeepCopy1() => new(){Name = this.Name,Age = this.Age,Address = new Address{Street = this.Address.Street,City = this.Address.City}};// 深拷贝 (使用 System.Text.Json)public Person DeepCopy2(){var json = JsonSerializer.Serialize(this);return JsonSerializer.Deserialize<Person>(json)!;}
}[Serializable]
public class Address
{public string Street { get; set; } = string.Empty;public string City { get; set; } = string.Empty;
}
  • 拷贝测试类 CopyBenchmark
//===========================
// 拷贝测试类 CopyBenchmark
//===========================using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;
using Datadog.Trace.BenchmarkDotNet;namespace BenchmarkTest.examples.Copy;[DatadogDiagnoser]
[MemoryDiagnoser]
public class CopyBenchmark
{private Person _person = new();[GlobalSetup]public void Setup(){_person = new Person{Name = "John",Age = 30,Address = new Address { Street = "Main St", City = "New York" }};}[Benchmark]public object ShallowCopyTest() => _person.ShallowCopy();[Benchmark]public object DeepCopy1Test() => _person.DeepCopy1();[Benchmark]public object DeepCopy2Test() => _person.DeepCopy2();public static void Run(IConfig config){var summary = BenchmarkRunner.Run<CopyBenchmark>(config);Console.WriteLine(summary);}
}

🏁 启动基准测试

  • Program.cs 中运行基准测试
using BenchmarkDotNet.Configs;
using BenchmarkTest.examples.Copy;
using Datadog.Trace.BenchmarkDotNet;Console.WriteLine("Hello, BenchmarkDotNetTest!");var config = DefaultConfig.Instance.WithDatadog();
CopyBenchmark.Run(config);
  • 运行测试
dotnet run -c Release

输出信息:

CopyBenchmark

以下是对 BenchmarkDotNet 测试报告的详细分析与解释:


📊 测试环境概览

项目说明
BenchmarkDotNet 版本v0.13.2
操作系统Windows 11 (10.0.26100)
.NET SDK9.0.301
运行时.NET 9.0.6(AOT/AVX2)

🧪 性能指标说明

指标含义
Mean平均执行时间(纳秒 ns)
Error置信区间误差范围(通常为 ± 值)
StdDev标准差,衡量运行时间波动性
Median中位数,比平均值更稳定
Gen0Gen0 GC 次数(每 1000 次操作)
Allocated每次操作分配的内存大小

🔍 测试方法分析

✅ ShallowCopyTest
  • Mean: 69.06 ns
  • Allocated: 40 B
  • 特点
    • 使用 MemberwiseClone() 实现浅拷贝。
    • 只复制对象本身字段,引用类型字段共享地址。
    • 性能高、内存占用低。
    • 不涉及复杂序列化或深拷贝逻辑。

结论:速度快,适用于不需要独立副本的场景。


✅ DeepCopy1Test
  • Mean: 27.87 ns
  • Allocated: 104 B
  • 实现方式
    • 手动实现的深拷贝(new 新对象并赋值)。
    • 或者使用了高性能的表达式树/源生成器等技术。

结论:虽然比浅拷贝慢一点,但仍是高效且完全独立的对象副本,适合大多数业务场景。


⚠️ DeepCopy2Test
  • Mean: 1,693.59 ns(约 60 倍于 DeepCopy1)
  • Allocated: 1,168 B(约 10 倍于 DeepCopy1)
  • 实现方式
    • 使用 JSON 序列化反序列化(如 System.Text.Json)。
    • 或者第三方库。

结论:性能明显下降,适合数据结构复杂但需要通用性的场景。若对性能敏感,应考虑优化深拷贝方式(如手动克隆或使用 FastDeepCloner 等库)。


📌 总结对比

方法执行时间内存分配是否独立副本推荐用途
ShallowCopyTest✅ 最快✅ 最少❌ 否快速只读复制
DeepCopy1Test⚠️ 较快⚠️ 适中✅ 是高性能深拷贝
DeepCopy2Test❌ 慢❌ 较多✅ 是复杂结构 / 快速开发

🛠️ 建议优化方向

  1. 避免使用 JSON 序列化进行频繁深拷贝,除非对象结构非常复杂。
  2. 优先手动实现深拷贝逻辑 或使用源生成工具(如 FastDeepCloner)提升性能。
  3. 若需通用性,可结合缓存机制减少重复深拷贝开销。
  4. 对性能要求极高时,可使用 Span<T>Memory<T> 进行无堆分配拷贝。

文章转载自:

http://jLwNx0rN.cnqdn.cn
http://T1Skvl63.cnqdn.cn
http://6Diulj8c.cnqdn.cn
http://48s0Q0Km.cnqdn.cn
http://XTKkw5Ai.cnqdn.cn
http://c5znEld0.cnqdn.cn
http://gO92qdiJ.cnqdn.cn
http://WhGrW5aw.cnqdn.cn
http://754pcAm8.cnqdn.cn
http://OR7moz3l.cnqdn.cn
http://VhvMvf1V.cnqdn.cn
http://kdICsw9I.cnqdn.cn
http://1A828g7s.cnqdn.cn
http://07vyDwPi.cnqdn.cn
http://aKz6HeGE.cnqdn.cn
http://pIYAe2HF.cnqdn.cn
http://OCHTXrkW.cnqdn.cn
http://9UwgMWJh.cnqdn.cn
http://Vy2CVUb7.cnqdn.cn
http://5OVBuhl1.cnqdn.cn
http://ATSUPbup.cnqdn.cn
http://xjw4apPy.cnqdn.cn
http://zEwQKmWe.cnqdn.cn
http://mqz6FSpV.cnqdn.cn
http://XTVIjqZL.cnqdn.cn
http://WmIW7fkh.cnqdn.cn
http://DBiPFf75.cnqdn.cn
http://NS2p0PJ1.cnqdn.cn
http://F5rfvBr1.cnqdn.cn
http://nbdMPhpx.cnqdn.cn
http://www.dtcms.com/wzjs/744428.html

相关文章:

  • 专做会议发布的网站滨州企业网站建设
  • 做模块高考题的网站网站开发安全性分析
  • 网站建设与代运营介绍找人做彩票网站有哪些
  • 网站的推广方案的内容有哪些教育网站建设的雷区
  • 网站开发一年费用总计it外包的优点不包括
  • 人社部门网站建设做微信小程序需要什么技术
  • 做网站会提供源代码吗河南新乡做网站公司哪家好
  • 建设网站系统昆山汽车网站建设
  • 驻马店 网站建设游戏工作室加盟需要什么条件
  • 中山市建设安全监督站网站2023年8月份新冠
  • 设计网站登录框ps怎么做wordpress微信免签约支付插件
  • 长沙网站建设商城渭南是哪个省
  • 建设网站会员内网 做 网站
  • 做网站一定要有空间吗临沂网站关键词
  • 网站建设捌金手指下拉十六360浏览器网页
  • 网站公司的利润预测2025年网络营销的发展
  • 重庆如何做聚政网站云南省建设工程造价信息网
  • 厦门网站建设门户房地产平面设计主要做什么
  • 网站建设hnshangtian如何登录qq网页版
  • 陵水网站建设咨询口腔网站模板
  • 天津网站建设制作开发公司北京网络公司注册
  • 建设银行信用卡网站登录安康网站建设制作
  • 惠州网站建设行业网站建设刂金手指下拉十五
  • 极乐宝盒网站建设上海外贸网站制作
  • 有关于网站开发的参考文献自己编辑网站怎么做的
  • 建立网站的主要方式做画找图网站
  • 沈阳企业免费建站南京汽车集团网站建设
  • 天津网站建设制作在线正能量网站地址链接免费
  • 关于做书的网站网络公司 网站设计
  • 楚雄州建设局网站电子商务网站建设及维护管理