C#中存入temp至ResList后调用Clear()引发未处理异常的原因?
问题原因及解决方案
问题根源
C#里的List<T>是引用类型,不是值类型。当你执行resList.Add(temp)时,并没有把temp里的元素复制一份存到resList里,而是把temp这个列表对象的内存引用(地址)存了进去。这就意味着:
- resList里的第一个元素(
resList[0])和你定义的temp变量,指向的是同一个内存中的列表对象。
当你调用temp.Clear()时,实际上是清空了这个共享的列表对象,resList里的那个元素自然也跟着变成了空列表。这时候你去访问resList[0][1],空列表根本没有索引1的元素,直接触发索引越界异常。
解决办法
有两种常见的修复方式:
1. 添加时复制新列表
每次往resList里加的时候,创建一个新的List来复制temp的元素,断开引用关联:
// 替换原resList.Add(temp)为下面这句 resList.Add(new List<int>(temp));
这样resList里存的是独立的新列表,后续操作temp不会影响已经存入resList的内容。
2. 复用前重新实例化temp
不要用Clear(),而是直接让temp指向一个新的List对象:
// 替换temp.Clear()为下面这句 temp = new List<int>();
这样原来的列表对象还留在resList里,temp变成了新的空列表,两者互不影响。
内容的提问来源于stack exchange,提问作者Osmy09
相关产品推荐
相关产品推荐

