代码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都是它对应的;
想请问下这是什么原因导致的?
代码过于复杂,没看懂,但肯定与引用类型有关。
代码其实就是一个筛选后循环赋值;我也觉得是和引用类型有关,但是我找不到相关说明
@白鲟: 举个例子,好比你有三个集合,A,B,C;初始设置A=B;然后再设置B=C;此时再去看看A的值,跟C的值是一样的,但是明明你没有给A赋C的值,同样的你设置三个值类型的变量,按同样的逻辑去赋值,A最终还是A。这便是引用类型和值类型的区别,从字面意思来理解,他们三个已经产生了连带关系,引用了,就分不开了。所以你这个问题,应该就是引用类型引起的,如果不嫌麻烦,可以分布来实现看看。
@龙行天涯: 是引用类型的问题,LoadOrderedDetailList函数每次返回的值都放在一个没有每次调用都实例化的list集合里面,所以就出现了引用类型的那个经典现象
代码1不应该出问题,你看看是不是你的LoadOrderedDetailList函数有问题
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;
}
代码1,2都是调的LoadOrderedDetailList函数,应该不是这个函数的问题
@WmW: detailList=null的情况实际不会发生,在selectConsumableInputList的类的构造函数里就实例化过detailList了
的确是LoadOrderedDetailList函数的问题😂,LoadOrderedDetailList函数每次返回的值都放在一个没有每次调用都实例化的list集合里面,所以就出现了引用类型的那个经典现象