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;