日期:2014-05-18  浏览次数:21102 次

调用list的TrimExcess方法后为什么list的Capacity属性没变?
http://www.cnblogs.com/buguge/archive/2012/05/25/2518480.html#commentform

这个帖子是介绍list的一些内存分配的情况

C# code

List<int> value = new List<int>(4);
//此时 Count:0 Capacity: 4
            
for (int i = 1; i <= 5; i++)
{
    value.Add(i);
}
//此时 Count:5 Capacity: 8            

value.TrimExcess();
//此时 Count:5 Capacity: 5
            

//remove an item
value.RemoveAt(4);
//此时 Count:4 Capacity: 5
value.TrimExcess();
//此时 Count:4 Capacity: 5---------------[color=#FF0000]Capacity为什么不是4呢?请高手指点[/color]
//remove another item
value.RemoveAt(1);
//此时 Count:3 Capacity: 5
value.TrimExcess();
//此时 Count:3 Capacity: 3

value.Clear();
//此时 Count:0 Capacity: 3
value.TrimExcess();
//此时 Count:0 Capacity: 0




其他地方调用TrimExcess方法后list长度都是和元素个数一样,唯独那里RemoveAt(4)后再TrimExcess长度不变

和博主一样不明白,望指教


------解决方案--------------------
看帮助说的很明白了

如果不向集合中添加新元素,则此方法可用于最小化集合的内存开销。 但是,重新分配和复制很大的 List<T> 的开销可能很大,因此,如果列表大于容量的 90%,则 TrimExcess 方法将不执行任何操作。