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

电商网站开发目的软件开发专业难学吗

电商网站开发目的,软件开发专业难学吗,做团购网站需要什么,关于网站建设项目创业计划书一#xff1a;背景 1. 讲故事昨天群里有位朋友问#xff1a;linq 查询的结果会开辟新的内存吗#xff1f;如果开了#xff0c;那是对原序列集里面元素的深拷贝还是仅仅拷贝其引用#xff1f;其实这个问题我觉得问的挺好#xff0c;很多初学 C# 的朋友或多或少都有这样的疑… 一背景 1. 讲故事昨天群里有位朋友问linq 查询的结果会开辟新的内存吗如果开了那是对原序列集里面元素的深拷贝还是仅仅拷贝其引用其实这个问题我觉得问的挺好很多初学 C# 的朋友或多或少都有这样的疑问甚至有 34 年工作经验的朋友可能都不是很清楚这就导致在写代码的时候总是会畏手畏脚还会莫名的揪心这样玩的话内存会不会暴涨暴跌这一篇我就用 windbg 来帮助朋友彻底分析一下。二寻找答案1. 一个小案例这位老弟提到了是深拷贝还是浅拷贝本意就是想问linq 一个引用类型集合 到底会怎样 这里我先模拟一个集合代码如下class Program{static void Main(string[] args){var personList  new ListPerson() {new Person() { Namejack, Age20 },new Person() { Nameelen,Age25,  },new Person() {  Namejohn, Age22 }};var query  personList.Where(m  m.Age  20).ToList();Console.WriteLine($query.count{query.Count});Console.ReadLine();}}class Person{public string Name { get; set; }public int Age { get; set; }}2. 真的是深copy吗如果用 windbg 的话就非常简单了假设是深copy 的话那么 query 之后托管堆上就会有 5个 Person那是不是这样呢用 !dumpheap -stat -type Person 到托管堆验证一下即可。 0:000 !dumpheap -stat -type Person Statistics:MT    Count    TotalSize Class Name 00007ff7f27c3528        1           64 System.Func2[[ConsoleApp5.Person, ConsoleApp5],[System.Boolean, System.Private.CoreLib]] 00007ff7f27c2b60        2           64 System.Collections.Generic.List1[[ConsoleApp5.Person, ConsoleApp5]] 00007ff7f27c9878        1           72 System.Linq.EnumerableWhereListIterator1[[ConsoleApp5.Person, ConsoleApp5]] 00007ff7f27c7a10        3          136 ConsoleApp5.Person[] 00007ff7f27c2ad0        3           96 ConsoleApp5.Person从最后一行输出可以看到: ConsoleApp5.Person 的 Count3也就表明没有所谓的深copy如果你还不信的话可以在 query 中修改某一个Person的Age看看原始的 personList 集合是不是同步更新,修改代码如下static void Main(string[] args){var personList  new ListPerson() {new Person() { Namejack, Age20 },new Person() { Nameelen,Age25,  },new Person() {  Namejohn, Age22 }};var query  personList.Where(m  m.Age  20).ToList();//故意修改 Age25 为  Age100 query[0].Age  100;Console.WriteLine($query[0].Age{query[0].Age}, personList[2].Age{personList[1].Age});Console.ReadLine();}从截图来看更加验证了 并没有所谓的 深copy 一说。3. 真的是 copy 引用吗要验证是不是 copy 引用最粗暴的方法就是看看 query 这个数组在 托管堆上的存储行态就明白了同样你也可以借助 windbg 去验证一下先到线程栈去找 query 变量然后用 da 命令 对 query 进行打印。 0:000 !clrstack -l OS Thread Id: 0x809c (0)Child SP               IP Call Site 000000E143D7E9B0 00007ff7f26f18be ConsoleApp5.Program.Main(System.String[]) [E:\net5\ConsoleApp5\ConsoleApp5\Program.cs  20]LOCALS:0x000000E143D7EA38  0x00000218266aab700x000000E143D7EA30  0x00000218266aad980:000 !do 0x00000218266aad98 Name:        System.Collections.Generic.List1[[ConsoleApp5.Person, ConsoleApp5]] MethodTable: 00007ff7f27b2b60 EEClass:     00007ff7f27abad0 Size:        32(0x20) bytes File:        C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.9\System.Private.CoreLib.dll Fields:MT    Field   Offset                 Type VT     Attr            Value Name 0000000000000000  4001c35        8              SZARRAY  0 instance 00000218266aadb8 _items 00007ff7f26bb1f0  4001c36       10         System.Int32  1 instance                2 _size 00007ff7f26bb1f0  4001c37       14         System.Int32  1 instance                2 _version 0000000000000000  4001c38        8              SZARRAY  0   static dynamic statics NYI                 s_emptyArray0:000 !da 00000218266aadb8 Name:        ConsoleApp5.Person[] MethodTable: 00007ff7f27b7a10 EEClass:     00007ff7f26b6580 Size:        56(0x38) bytes Array:       Rank 1, Number of elements 4, Type CLASS Element Methodtable: 00007ff7f27b2ad0 [0] 00000218266aac00 [1] 00000218266aac20 [2] null [3] null从最后四行代码可以看出数组有 4 个格子前2个格子放的是内存地址后两个都是 null可能有些朋友会问query 不是 2 条记录吗怎么会有 4 个格子呢这是因为 query 是 List 结构而 List 底层用的是数组默认以 4 个格子起步不信的话翻一下 List 原代码即可。public class ListT{private void EnsureCapacity(int min){if (_items.Length  min){int num  (_items.Length  0) ? 4 : (_items.Length * 2);   //默认 4 个大小if ((uint)num  2146435071u){num  2146435071;}if (num  min){num  min;}Capacity  num;}}}如果你想进一步查看数组中前两个元素 00000218266aac00, 00000218266aac20 指向的是什么可以用 !do 打印一下即可。 0:000 !do 00000218266aac00 Name:        ConsoleApp5.Person MethodTable: 00007ff7f27b2ad0 EEClass:     00007ff7f27c2a00 Size:        32(0x20) bytes File:        E:\net5\ConsoleApp5\ConsoleApp5\bin\Debug\netcoreapp3.1\ConsoleApp5.dll Fields:MT    Field   Offset                 Type VT     Attr            Value Name 00007ff7f2771e18  4000001        8        System.String  0 instance 00000218266aab30 Namek__BackingField 00007ff7f26bb1f0  4000002       10         System.Int32  1 instance               25 Agek__BackingField 0:000 !do 00000218266aac20 Name:        ConsoleApp5.Person MethodTable: 00007ff7f27b2ad0 EEClass:     00007ff7f27c2a00 Size:        32(0x20) bytes File:        E:\net5\ConsoleApp5\ConsoleApp5\bin\Debug\netcoreapp3.1\ConsoleApp5.dll Fields:MT    Field   Offset                 Type VT     Attr            Value Name 00007ff7f2771e18  4000001        8        System.String  0 instance 00000218266aab50 Namek__BackingField 00007ff7f26bb1f0  4000002       10         System.Int32  1 instance               22 Agek__BackingField到这里为止我觉得回答这位朋友的疑问应该是没有问题了不过这里既然说到了集合中的引用类型不得不说一下集合中的值类型又会是怎么样的三集合中的值类型是什么样的copy方式 1. 使用 windbg 验证有了上面的基础验证这个问题的答案就简单了先上测试代码static void Main(string[] args){var list  new Listint() { 1, 2, 3, 4, 5, 6, 7,8,9,10 };var query  list.Where(m  m  5).ToList();Console.ReadLine();}然后直接把整个数组内容打印出来 // list 0:000 !DumpArray /d 0000019687c8aba8 Name:        System.Int32[] MethodTable: 00007ff7f279f090 EEClass:     00007ff7f279f010 Size:        88(0x58) bytes Array:       Rank 1, Number of elements 16, Type Int32 Element Methodtable: 00007ff7f26cb1f0 [0] 0000019687c8abb8 [1] 0000019687c8abbc [2] 0000019687c8abc0 [3] 0000019687c8abc4 [4] 0000019687c8abc8 [5] 0000019687c8abcc [6] 0000019687c8abd0 [7] 0000019687c8abd4 [8] 0000019687c8abd8 [9] 0000019687c8abdc [10] 0000019687c8abe0 [11] 0000019687c8abe4 [12] 0000019687c8abe8 [13] 0000019687c8abec [14] 0000019687c8abf0 [15] 0000019687c8abf4// query 0:000 !DumpArray /d 0000019687c8ae68 Name:        System.Int32[] MethodTable: 00007ff7f279f090 EEClass:     00007ff7f279f010 Size:        56(0x38) bytes Array:       Rank 1, Number of elements 8, Type Int32 Element Methodtable: 00007ff7f26cb1f0 [0] 0000019687c8ae78 [1] 0000019687c8ae7c [2] 0000019687c8ae80 [3] 0000019687c8ae84 [4] 0000019687c8ae88 [5] 0000019687c8ae8c [6] 0000019687c8ae90 [7] 0000019687c8ae94仔细对比 list 和 query 的数组呈现发现有两点好玩的信息值类型和引用类型一样数组中都是存放地址的。值类型数组中的所有格子都被填满不像引用类型数组中还有 null 的情况。接下来的问题是数组中每个元素的地址到底指向了谁可以挑出每个数组的 0 号元素地址用 dp 命令看一看 //list 0:000 dp 0000019687c8abb8 0000019687c8abb8  0000000200000001 0000000400000003 0000019687c8abc8  0000000600000005 0000000800000007 0000019687c8abd8  0000000a00000009 0000000000000000//query 0:000 dp 0000019687c8ae78 0000019687c8ae78  0000000700000006 0000000900000008 0000019687c8ae88  000000000000000a 0000000000000000看到没有原来地址上面存放的都是数字值深copy无疑哈。四总结 以上所有的分析可以得出引用类型数组是引用copy值类型数组是深copy有时候背诵得来的东西总是容易忘记只有实操验证才能真正的刻骨铭心????????????
http://www.zqtcl.cn/news/628140/

相关文章:

  • 专业的西安免费做网站wordpress手机端插件
  • 口碑好网站建设优化大师win10下载
  • 网站建设普及型小程序开发平台好的有哪些
  • 网站建设与管理专业凡科做的网站好吗
  • wordpress添加变量福州seo网站管理
  • 哔哩哔哩免费网站观看网站制作合同书
  • 自流井移动网站建设建设网站的一般步骤
  • 手机导航网站模板上海低价网站建设
  • 如何开公司注册需要多少钱东莞网站推广优化网上推广公司
  • 新闻门户网站制作教育培训网站开发
  • 网站建设公司哪个好一点最近一周的热点新闻
  • 做最优秀的自己的视频网站佛山搜索引擎优化
  • 六盘水市网站建设免费封面设计在线制作生成
  • 北京快速建站制作公司wordpress wpoptions
  • iis如何建立网站门源县住房和城乡建设局网站
  • 装修素材图片都从什么网站找铁门关网站建设
  • 网站服务器环境不支持mysql数据库免费商标图案logo
  • 以什么主题做网站好wordpress怎么设置404
  • 为什么手机进网站乱码网络营销工具的特点
  • DW怎么做网站下拉菜单网站建设外包网站
  • 手机做兼职的网站设计公司注册记账代理公司
  • 如何在vs做网站建筑工程电影网
  • 甘肃网站开发网站建设自己在家接单
  • 龙岗网站制作资讯福田区龙岗区发布通告
  • 百度如何快速收录网站嘉兴手机建站模板
  • 服务注册中心有哪些给你一个网站你如何做优化
  • 我做网站如何分流客户openwrt 做视频网站
  • 徐州微信网站建设建设工程项目
  • 便宜网站建设公司envision wordpress
  • 网站怎么做百度快照logo网站域名做固定资产怎么处理