C#中修改赋值后的List为何会影响传入的原List?
问题原因与技术提示
问题原因
C#中的List<T>属于引用类型,而非值类型。当你执行arg_list1 = arg_list0时,并没有复制整个列表的数据,只是让arg_list1变量和arg_list0指向了内存中同一个列表实例。所以后续调用arg_list1.RemoveRange()时,本质上是在修改这个共享的列表实例,自然原传入的arg_list0也会同步发生变化。
技术解决提示
要让arg_list1成为独立于arg_list0的列表,需要创建原列表的副本,常用两种方式:
- 使用List的构造函数直接复制元素:
List<(DateTime pro_opentimes, double pro_opencost)> arg_list1 = new List<(DateTime pro_opentimes, double pro_opencost)>(arg_list0); - 借助LINQ的
ToList()方法(需先引用System.Linq命名空间):var arg_list1 = arg_list0.ToList();
注:你的列表元素是值类型元组(
DateTime和double都是值类型),以上浅拷贝方式就能让两个列表完全独立。如果列表元素是自定义类这类引用类型,还需要考虑深拷贝,但当前场景不需要。
代码修正示例
将原代码中赋值arg_list1的行替换为上述副本创建代码即可,修改后:
//创建原列表的独立副本,修改arg_list1不会影响arg_list0 List<(DateTime pro_opentimes, double pro_opencost)> arg_list1 = new List<(DateTime pro_opentimes, double pro_opencost)>(arg_list0);
内容的提问来源于stack exchange,提问作者desiredness
相关产品推荐
相关产品推荐

