2017-10-11 46 views
1

从静态,我明白,每当声明一个静态变量 - 它的内存得到分配在RAM中。假设,我们有整数static int i = 5;然后一个4字节的内存将被占用计算机中的某个地方。如果我有一个静态类或任何引用类型,将会发生同样的情况。内存管理如何在c#中的静态通用列表中工作?

但我的问题是 - 如果我在c#中声明一个像List<string>这样的通用列表并且它是静态的。那么在计算机中为这个列表分配多少或多少内存。我假设如果我在这个列表中添加项目 - 那么它将需要更多的内存。

  • 所以,它打破了我的概念是静态 - 静态字段具有 在声明的时间固定的内存分配,并且无法通过应用程序生命周期被改变。

c#中的某个天才能帮我出来吗?

+0

静态实际上是相同的内存区(地址)没有必要它是我猜的数量。 – MadOX

+0

谁说静态字段有固定的内存分配? –

+2

静态或非静态与内存管理将如何表现无关。静态只是一个非常渴望的生活对象,将被视为这样。 “静态”是一个误称,因此具有误导性,对此它没有任何静态的东西; 'static'确实意味着[“与类型相关联,而不是任何类型的实例”](https://stackoverflow.com/a/9410742/767890)。 – InBetween

回答

0

您对.NET如何进行内存管理做了一些假设。

引擎盖下(我建议你看)List使用Array分配数据块,并除非被实例化一个大小为4,所以你必须乘上了阵列的指针和它的大小大小为int。最初使用的内存量取决于实例化List时阵列的大小。

E.g.如果您有List<int>那么您有一个存储指针,用于List实例,存储器指针为Array,以及您在构造函数中设置的任意大小乘以数据类型T所需的内存量。所有这些最初放入Gen0高速缓存中,当您填充,删除和使用List时,会分配或释放更多或更少的内存,并将其移至Gen1和Gen2块。

考虑到上述所有情况,除非问题得到完善,否则没有确定的答案。 “当我实例化List<int>(5)时分配了多少内存?”

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

1

与非静态成员相比,静态成员的分配没有区别。 “静态”只是表示该成员对于声明它的类的所有实例都是可见的和可访问的。

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

0

从另一个角度来看,也许帮助的方法是解释.net中的“静态”。

这里有一个简单的类:

public class MyClass 
{ 
    public string Zeus; 
    public static string Hades; 
} 

好了,这是什么“静态”的意思是我们的阎王字符串?静态基本上意味着:它只存在于一个地方 - 无论你制作多少个实例,只有一个Hades字符串。

MyClass first = new MyClass(); 
MyClass second = new MyClass(); 
MyClass third = new MyClass(); 

......现在有三个宙斯琴弦。一个为每个MyClasses的:

first.Zeus = "first"; 
second.Zeus = "second"; 
third.Zeus = "third"; 

...但只有一个阎王:

MyClass.Hades = "only version"; 

通知我怎么没把 'first.Hades',或 'second.Hades'?那是因为,因为只有一个版本,所以我不必通过实例来实现它。事实上,VisualStudio会告诉你,“我不能这样做 - 你试图获得一个静态变量,但你试图通过一个实际的类实例来实现它。”

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

那么,回到你的记忆问题?

public class MyClass 
{ 
    public List<string> Zeus; 
    public static List<string> Hades; 
} 

方式这些名单真的保存没有任何不同。唯一不同的是,你将永远有一个你的静态哈迪斯变量列表...并且你将拥有作为你创建的每个MyClass的宙斯列表(未被垃圾收集)

有意义?将这个概念放下是非常重要的,因为它可以用来缓存或者拥有一个Singleton全局对象等lot