C# 额外列表<&燃气轮机;内存中的对象

C# 额外列表<&燃气轮机;内存中的对象,c#,list,memory,C#,List,Memory,考虑以下简单代码: class Program { static List<Data> listData = new List<Data>(); static void Main(string[] args) { for (int i = 0; i < 5; i++) { Data newData = new Data(); newData.num1 = i;

考虑以下简单代码:

class Program
{
    static List<Data> listData = new List<Data>();
    static void Main(string[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            Data newData = new Data();
            newData.num1 = i;
            newData.num2 = i * 5;
            listData.Add(newData);
        }
        Console.ReadLine();
    }
}

class Data
{
    public int num1 { get; set; }
    public int num2 { get; set; }
}
类程序
{
静态列表listData=新列表();
静态void Main(字符串[]参数)
{
对于(int i=0;i<5;i++)
{
Data newData=新数据();
newData.num1=i;
newData.num2=i*5;
listData.Add(newData);
}
Console.ReadLine();
}
}
类数据
{
公共整数num1{get;set;}
公共int num2{get;set;}
}
出于某种原因,在为这段代码分析内存时,它显示内存中有2Data[]对象(我假设是listData对象):
有人能解释一下原因吗?

我想你可以指望垃圾收集器来完成它的工作。。。别担心
(我没有足够的声誉来发表评论)

我想你可以指望垃圾收集器来完成它的工作。。。别担心
(我没有足够的声誉将此作为评论发布)

不,内存中没有额外的
列表,您有两个
数据[]
数组。哪些是您创建的列表对象的基础存储

列表以一个空数组开始,第一个Add()调用创建一个可以容纳4个元素的Data[]数组。它在第五次Add()调用时运行,现在它创建了一个Data[]数组,该数组的大小是原来的两倍,它可以存储8个元素。内存分析器仍然可以看到垃圾数据[]数组,GC还没有运行


您可以使用Capacity属性对此进行优化。更多详细信息请参见。

不,内存中没有额外的
列表,您有两个
数据[]
数组。哪些是您创建的列表对象的基础存储

列表以一个空数组开始,第一个Add()调用创建一个可以容纳4个元素的Data[]数组。它在第五次Add()调用时运行,现在它创建了一个Data[]数组,该数组的大小是原来的两倍,它可以存储8个元素。内存分析器仍然可以看到垃圾数据[]数组,GC还没有运行


您可以使用Capacity属性对此进行优化。有关更多详细信息,请参见。

您是如何确定内存中有2个列表对象的?@codequestioneer使用dotMemory 4和ANTS Profiler。这是什么
控制台应用程序。数据[]
?要计算您使用了多少实例,请使用
listData.count
@AsfK listData.count将提供数据的数量,而不是listData的实例。您是如何计算出内存中有2个列表对象的?@codequestioneer使用dotMemory 4和ANTS Profiler。这是什么
ConsoleApplication.Data[]
?要计算有多少实例,请使用
listData.count
@AsfK listData.count将提供数据的数量,而不是listData的实例。谢谢,但强制GC不会删除它。我想了解为什么有两个。谢谢,但强制GC并不会删除它。我想理解为什么有两个。谢谢解释,但是当我强制GC时,没有任何内容被删除。你必须问另一个问题,先读。谢谢解释,但是当我强制GC时,没有任何内容被删除。你必须问另一个问题,先读。