C#是否在列表中提前保留三个空实例<;对象>;?
我有以下资料:C#是否在列表中提前保留三个空实例<;对象>;?,c#,.net-3.5,windows-mobile-6.5,windows-embedded-compact,C#,.net 3.5,Windows Mobile 6.5,Windows Embedded Compact,我有以下资料: public static class LocalFileModelList { public static List<LocalFileModel> ModelList = new List<LocalFileModel>(); } public class LocalFileModel { public string Name { get; set; } public
public static class LocalFileModelList
{
public static List<LocalFileModel> ModelList = new List<LocalFileModel>();
}
public class LocalFileModel
{
public string Name { get; set; }
public string Extension { get; set; }
}
公共静态类LocalFileModelList
{
公共静态列表ModelList=新列表();
}
公共类LocalFileModel
{
公共字符串名称{get;set;}
公共字符串扩展名{get;set;}
}
然后是从目录中读取所有文件的方法
public static List<LocalFileModel> GetAllFiles(string path)
{
var files = Directory.GetFiles(path, "*.*");
foreach(var file in files)
{
var Extension = Path.GetExtension(file);
var Filename = Path.GetFileNameWithoutExtension(file);
var model = new LocalFileModel
{
Name = Filename,
Extension = Extension,
};
LocalFileModelList.ModelList.Add(model);
}
return LocalFileModelList.ModelList;
}
公共静态列表GetAllFiles(字符串路径)
{
var files=Directory.GetFiles(路径,*.*);
foreach(文件中的var文件)
{
var Extension=Path.GetExtension(文件);
var Filename=Path.GetFileNameWithoutExtension(文件);
var model=新的LocalFileModel
{
Name=文件名,
扩展=扩展,
};
LocalFileModelList.ModelList.Add(模型);
}
返回LocalFileModelList.ModelList;
}
我注意到,当我逐步浏览代码时,当我创建LocalFileModel
的新实例时,用数据填充它,然后将其添加到列表中。列表自动创建了另外三个类型为null
的实例。一旦这三个对象被各自的对象填充,它将再次创建更多的空实例
我现在才意识到,这很正常吗?是的。NET和大多数其他库都会分配一个带有额外空间(容量)的列表或向量,这样就不必不断调整和复制数据。
大小决定可访问的内容
默认容量在此处定义为4(但单据不必是):
列表
有一个内部数组,具有一定的容量,该容量始终等于或大于列表中的项目数
list.Capacity >= list.Count
实际上,您可以告诉列表应该使用什么容量创建其内部阵列
new List<int>(capacity: 5);
新列表(容量:5);
当插入一个项目且数组已满时,列表将创建一个新数组,该数组的大小是以前的两倍,以容纳新元素。因此,在您的情况下,如果要插入第5项,列表将分配一个新的内部数组,其中包含8个插槽(其中5个将被填充)
有关更多详细信息,请检查实现。如果您添加了初始值,则由列表持有的内部数组的值为4(当前为实现详细信息,可能会更改)。一旦您开始填充列表,它将按每次2的倍数调整自身大小。这就是为什么当您提前知道最小项目数时,您可以使用重载获取int capacity
(或者使用数组,如果它确实是一个固定大小)。列表由数组支持。如中所述,List
的默认/初始容量定义为4
,但在将项目添加到列表中之前,它不会生效
public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>
{
private const int _defaultCapacity = 4;
随后,随着每个新项目添加到列表中,容量将增加到元素数*2
这就是为什么在添加第一项时,可以看到三个null
空格,在列表中保留了三个额外的空格 是的,这是正常的,通常在插入期间调整大小时,内部缓冲区的大小会增加~2倍。只是为了澄清术语null
不是类型,表示非实例。
int newCapacity = _items.Length == 0? _defaultCapacity : _items.Length * 2;