首页 新闻 会员 周边

C# Winform 关于list.AddRange(xx)和list=xx的一个疑问

0
悬赏园豆:10 [已解决问题] 解决于 2021-12-09 17:33

代码1:
selectConsumableInputList.FindAll(a => a.detailList == null || a.detailList.Count == 0).ForEach(a => a.detailList = detailManage.LoadOrderedDetailList(a.ID, consumaInputDetailFiled));
代码2:
selectConsumableInputList.FindAll(a => a.detailList == null || a.detailList.Count == 0).ForEach(a => a.detailList.AddRange(detailManage.LoadOrderedDetailList(a.ID, consumaInputDetailFiled)));
发现使用代码1的话,selectConsumableInputList里面除了第一个对象的detailList之外,其他的对象的detailList都是最后一个对象的detailList,而使用代码2就是正常的,selectConsumableInputList里面每个对象的detailList都是它对应的;
想请问下这是什么原因导致的?

白鲟的主页 白鲟 | 初学一级 | 园豆:29
提问于:2021-12-09 15:49
< >
分享
最佳答案
0

代码过于复杂,没看懂,但肯定与引用类型有关。

收获园豆:5
龙行天涯 | 小虾三级 |园豆:1794 | 2021-12-09 16:25

代码其实就是一个筛选后循环赋值;我也觉得是和引用类型有关,但是我找不到相关说明

白鲟 | 园豆:29 (初学一级) | 2021-12-09 16:28

@白鲟: 举个例子,好比你有三个集合,A,B,C;初始设置A=B;然后再设置B=C;此时再去看看A的值,跟C的值是一样的,但是明明你没有给A赋C的值,同样的你设置三个值类型的变量,按同样的逻辑去赋值,A最终还是A。这便是引用类型和值类型的区别,从字面意思来理解,他们三个已经产生了连带关系,引用了,就分不开了。所以你这个问题,应该就是引用类型引起的,如果不嫌麻烦,可以分布来实现看看。

龙行天涯 | 园豆:1794 (小虾三级) | 2021-12-09 16:37

@龙行天涯: 是引用类型的问题,LoadOrderedDetailList函数每次返回的值都放在一个没有每次调用都实例化的list集合里面,所以就出现了引用类型的那个经典现象

白鲟 | 园豆:29 (初学一级) | 2021-12-09 17:28
其他回答(1)
0

代码1不应该出问题,你看看是不是你的LoadOrderedDetailList函数有问题

收获园豆:5
WmW | 园豆:424 (菜鸟二级) | 2021-12-09 16:30
static void Start() {
            List<AAA> aaa = new List<AAA>();
            aaa.Add(new AAA() { ID = 1, detailList = new List<int>() { 1, 2, 3 } });
            aaa.Add(new AAA() { ID = 2, detailList = new List<int>() });
            aaa.Add(new AAA() { ID = 3, detailList = null });

            aaa.FindAll(a => a.detailList == null || a.detailList.Count == 0).ForEach(a => a.detailList = BBB(a.ID, "123"));

            //第二个有问题,遇见detailList=null时就会报错
            //aaa.FindAll(a => a.detailList == null || a.detailList.Count == 0).ForEach(a => a.detailList.AddRange(BBB(a.ID, "456")));
        }
        static List<int> BBB(int id, string str) {
            return new List<int>() { id };
        }
        class AAA {
            public int ID;
            public List<int> detailList;
        }
支持(0) 反对(0) WmW | 园豆:424 (菜鸟二级) | 2021-12-09 16:31

代码1,2都是调的LoadOrderedDetailList函数,应该不是这个函数的问题

支持(0) 反对(0) 白鲟 | 园豆:29 (初学一级) | 2021-12-09 16:33

@WmW: detailList=null的情况实际不会发生,在selectConsumableInputList的类的构造函数里就实例化过detailList了

支持(0) 反对(0) 白鲟 | 园豆:29 (初学一级) | 2021-12-09 16:50

的确是LoadOrderedDetailList函数的问题😂,LoadOrderedDetailList函数每次返回的值都放在一个没有每次调用都实例化的list集合里面,所以就出现了引用类型的那个经典现象

支持(0) 反对(0) 白鲟 | 园豆:29 (初学一级) | 2021-12-09 17:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册