C#高阶与初心:(一)List.Add添加的到底是什么?
2018-01-29 16:47
134 查看
前几日与同事讨论一个相对复杂的场景,需要先将中间过程存储在List中,稍后再用。同时程序类的许多线程共用了一个全局变量。
具体来说就是如下代码
对于打印内容,到底是1、2、3不同内容呢,还是都是3的内容?大家意见不一。运行一下看看结果,当然是最简单的事情,这也不是最重要的。重要的是,玩儿C#这么多年,对于这么个简单的问题,我们都有自己的见解。
一边认为,既然都是将_order添加进去,而_order又在不断变化,最后肯定是都是一样的内容。另一边认为,记录的应该是内存的实际指向,除非记录的位置明确被更改,否则不应该变化,不会随之中间变量的变化而变化。事实证明,后者是正确的。
发散一下,如果是结构体(虽然现在已经用的很少了)的话,情况又有不同。。。如果在list添加进去一个结构体,然后对传入的中间变量进行更改,并不会反映的list对应的项上。
其实回头想想,这不就是我们初学面向对象语言时经常遇到的,对于一个函数形参的指针传递与值传递问题吗?
具体来说就是如下代码
。。。 _order = order1; _list.Add(_order); 。。。 _order = order2; _list.Add(_order); 。。。 _order = order3; _list.Add(_order); 。。。 _list.ForEach(o => PrintContent(o)); 。。。
对于打印内容,到底是1、2、3不同内容呢,还是都是3的内容?大家意见不一。运行一下看看结果,当然是最简单的事情,这也不是最重要的。重要的是,玩儿C#这么多年,对于这么个简单的问题,我们都有自己的见解。
一边认为,既然都是将_order添加进去,而_order又在不断变化,最后肯定是都是一样的内容。另一边认为,记录的应该是内存的实际指向,除非记录的位置明确被更改,否则不应该变化,不会随之中间变量的变化而变化。事实证明,后者是正确的。
发散一下,如果是结构体(虽然现在已经用的很少了)的话,情况又有不同。。。如果在list添加进去一个结构体,然后对传入的中间变量进行更改,并不会反映的list对应的项上。
其实回头想想,这不就是我们初学面向对象语言时经常遇到的,对于一个函数形参的指针传递与值传递问题吗?
相关文章推荐
- C# List<T> Add方法循环添加时只保存了最后一次的数据(覆盖问题)
- C#.NET底层 List 集合循环添加对象(如:list.add(model)),为什么会出现整个list集合都是一样的数据?
- Java中集合list的add方法添加的不是值COPY而是地址
- List使用add方法添加数据时的覆盖问题
- List 中添加多个List集合以及add() 与addAll()的区别
- C# List<> add函数总是覆盖List中原有元素的解决办法
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- C# List<> add函数总是覆盖List中原有元素的解决办法
- List 中添加多个List集合以及add() 与addAll()的区别
- List使用add方法添加对象-只显示最后添加的数据的问题
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- c#(winform)中自定义ListItem类方便ComboBox和ListBox添加项完全解决
- 转:C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- Java中集合list的add方法添加的不是值COPY而是地址
- C#之WinForm基础 用comboBox1.Items.Add()向comboBox添加可选数据
- C# list.add() list.join()用法
- list_add_tail 添加双向链表结点讲解
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据