假设我有一个通用列表:
List<int> myList= new List<int> {0,1,2,3};
执行myList.RemoveAt(0)
后,我的列表会缩小吗?
答案 0 :(得分:4)
当然会缩小。你可以自己解决这个问题:
int count = myList.Count;
但是为了进一步阐述,List<T>
类型有一个支持它的数组。当您创建这样的列表时:
var list = new List<int>(10);
它将创建一个长度为10的数组。如果从列表中删除项目,则计数将减少1.但是,数组仍将保持相同的长度。现在,如果向列表中添加10个以上的整数,那么该数组将不足以容纳11个整数,因此将创建一个更大的数组,并将原始数组的内容复制到更大的数组。
答案 1 :(得分:0)
@CodingYoshi在这里绝对正确。我只想添加一个代码示例来说明这一点:
List<int> listLength = new List<int>(10)
{
1, 2, 3, 4, 5
};
// 5
Console.WriteLine(listLength.Count);
// 10
Console.WriteLine(listLength.Capacity);
listLength.AddRange(new[] { 6, 7, 8, 9, 10 });
// 10
Console.WriteLine(listLength.Count);
// 10
Console.WriteLine(listLength.Capacity);
listLength.AddRange(new[] { 11, 12, 13, 14, 15 });
// 15
Console.WriteLine(listLength.Count);
// 20
Console.WriteLine(listLength.Capacity);
for (int i = 0; i < 10; i++)
{
listLength.RemoveAt(0);
}
// 5
Console.WriteLine(listLength.Count);
// Still 20 - as you can see, we decreased Count to the original number of items
// but Capacity didn't shrink to its original amount
Console.WriteLine(listLength.Capacity);
通常,从列表中删除项目不会导致后备阵列实际变小。 explicitly decrease capacity可以通过调用TrimExcess method释放额外空间,这将导致容量减少到当前计数。 (显然,如果当前计数实际上小于当前容量,这只会缩小后备阵列。)
话虽如此,从列表中移除对象可能会导致整个应用程序的内存占用量减少(如果从列表中删除对象导致对象符合垃圾回收条件)。集合类(以及事件处理程序)是内存泄漏的重要来源。 (Some people会争论这是否是“真实”内存泄漏的一个例子,但效果完全相同)。