Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中静态泛型列表的内存管理是如何工作的?_C#_.net_Oop_Memory_Clr - Fatal编程技术网

c#中静态泛型列表的内存管理是如何工作的?

c#中静态泛型列表的内存管理是如何工作的?,c#,.net,oop,memory,clr,C#,.net,Oop,Memory,Clr,从静态方面,我了解到,每当声明静态变量时,它的内存都会在RAM中分配。假设我们有整数static int i=5则计算机中的某个位置将占用一个4字节的内存。如果我有一个静态类或任何引用类型,也会发生同样的情况 但我的问题是——如果我在c#中声明一个类似于list的泛型列表,那么它是静态的。那个么在计算机中将为这个列表分配什么或多少内存。我假设如果我在这个列表中添加项目,那么它将需要更多的内存 所以,它打破了我关于静态的概念——静态场 声明时的固定内存分配,在应用程序生命周期内不能更改 有c方

从静态方面,我了解到,每当声明静态变量时,它的内存都会在RAM中分配。假设我们有整数
static int i=5则计算机中的某个位置将占用一个4字节的内存。如果我有一个静态类或任何引用类型,也会发生同样的情况

但我的问题是——如果我在c#中声明一个类似于
list
的泛型列表,那么它是静态的。那个么在计算机中将为这个列表分配什么或多少内存。我假设如果我在这个列表中添加项目,那么它将需要更多的内存

  • 所以,它打破了我关于静态的概念——静态场 声明时的固定内存分配,在应用程序生命周期内不能更改

有c方面的天才可以帮我吗?

你在对.NET如何进行内存管理做一些假设

在引擎盖下(我建议查看)
List
使用
Array
分配数据块,除非指定,否则实例化为4大小,因此您将有一个数组指针,它的大小乘以
int
的大小。最初使用的内存量取决于实例化
列表时数组的大小

例如,如果您有
列表
,那么您有一个用于
列表
实例的内存指针,一个用于
数组
的内存指针,以及您在构造函数中设置的大小乘以
T
数据类型所需的内存量。所有这些最初都会放入Gen0缓存中,在填充、取消填充和使用
列表时,会分配、释放或移动到Gen1和Gen2块中的内存

考虑到以上所有因素,除非对问题进行细化,否则没有明确的答案,例如“当我实例化
列表(5)
时分配了多少内存?”


至于
静态
,这几乎没有意义,因为必须为实例分配相同数量的内存。

静态成员的分配与非静态成员的分配没有区别。“Static”仅仅意味着该成员对声明它的类的所有实例都是可见的和可访问的

对于列表:使用“新”键工作实例化的所有对象都是在名为Heap的内存部分中创建的。你所询问的静态列表也是如此。
NET中的列表创建为特定长度的数组加上指向最终新数组的指针。然后,每当通过向列表中添加项来填充第一个数组时,就会创建一个新数组,并使用指针链接到第一个数组。通过这种方式,列表可以增长。

从另一个角度来看,也许可以解释一下.net中的“静态”是什么

下面是一个简单的类:

public class MyClass
{
    public string Zeus;
    public static string Hades;
}
好吧,那“静态”对我们的冥府弦意味着什么?静态基本上意味着:它只存在于一个地方——不管你创建了多少个类实例,只有一个Hades字符串

MyClass first = new MyClass();
MyClass second = new MyClass();
MyClass third = new MyClass();
。。。现在有三根宙斯弦。这些MyClass各有一个:

first.Zeus = "first";
second.Zeus = "second";
third.Zeus = "third";
。。。但只有一个地狱:

MyClass.Hades = "only version";
注意到我没有把“第一。哈迪斯”或“第二。哈迪斯”放在第一位吗?这是因为,因为只有一个版本,所以我不必通过实例来了解它。事实上,VisualStudio会直截了当地告诉您,“我做不到这一点——您试图获得一个静态变量,但您试图通过类的实际实例获得它。”

相反,您只需使用:MyClass.Hades

那么,回到你的记忆问题上来

public class MyClass
{
    public List<string> Zeus;
    public static List<string> Hades;
}
公共类MyClass
{
公开名单宙斯;
公共静态列表Hades;
}
这些列表的存储方式其实没有什么不同。唯一的区别是,静态Hades变量总是有一个列表。。。你将为你创建的每一个MyClass(还没有收集到垃圾)提供一个宙斯列表


有道理吗?把这个概念记下来是很重要的,因为它将在缓存或具有单例全局对象等方面发挥很大作用。

静态实际上是相同的内存区域(地址)我猜不一定是数量。谁说静态字段有固定的内存分配?
static
或non
static
与内存管理的行为几乎没有关系。静态对象只是一个存在时间很长的对象,因此将被视为静态对象<代码>静态
是一个用词不当的词,因此具有误导性,它实际上没有任何非常静态的东西<代码>静态
实际上是指内存。关于内存,也许这个链接可以帮助您:列表是引用类型,所以您只分配4或8个字节来存储对对象的引用。正式地说,在加载程序堆中,所有静态都被分配,它与AppDomain相关联。列表的内容通常在GC堆中。如果不使用Clear()和/或TrimAccess(),它将永远不会被垃圾收集。