4

原始數據類型(int,char等)的內存是否在離開作用域後立即釋放,或者被添加到垃圾回收以供以後發佈?.net垃圾回收和管理資源

考慮:

For x as integer=0 to 1000 
dim y as integer 
Next 

如果不加1000個整數垃圾收集器清理後, 它是如何看待的字符串對象?這會創建1000個字符串以後清理嗎?

For x as integer=0 to 1000 
dim y as string="" 
Next 

如何僅包含int,string等數據類型的結構?

只包含託管資源的類?

回答

7

好了,只有兩個答案已經有誤傳......

  • 字符串不是一個基本類型
  • 字符串不是一個值類型
  • 值類型值始終在堆棧上創建 - 取決於變量的位置。如果它是一個類的一部分,它將與該對象的其餘數據一起存儲在堆上。
  • 即使當地變量可以在堆上結束,如果他們捕獲(在匿名函數和迭代器塊例如)
  • 字符串常量,如「」被拘禁 - 他們總是解析爲相同的串。該循環實際上並不創建任何字符串。

欲瞭解更多信息,請參閱我的文章what goes where in .NET memory。你可能也想考慮whether it's important or not

+0

字符串是一種原始類型http://msdn.microsoft.com/en-us/library/aa711900.aspx – foson 2009-01-29 21:09:15

4

原始數據類型(字符串除外)是值類型,並且在堆棧上創建,而不是在堆上創建。當它們超出範圍時,它們從堆棧中彈出;他們不是垃圾收集。

字符串是引用類型,分配在堆上,並被垃圾收集。 .NET使用String Interning對字符串的內存管理進行了一些優化。 (即你可能只有內存中的字符串「」的一個實例.net可以這樣做,因爲字符串是不可變的)

1

有了這兩個答案,除了this article之外,對.Net中的垃圾收集工作有很好的描述。