.net垃圾收集和托管资源

.net垃圾收集和托管资源,.net,memory-management,memory-leaks,garbage-collection,performance,.net,Memory Management,Memory Leaks,Garbage Collection,Performance,原语数据类型(int、char等)的内存离开作用域后是否立即释放,或者添加到垃圾收集中以供以后释放 考虑: 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等的结构怎么样。。。数据类型 仅包含托管

原语数据类型(int、char等)的内存离开作用域后是否立即释放,或者添加到垃圾收集中以供以后释放

考虑:

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等的结构怎么样。。。数据类型

仅包含托管资源的类?

基本数据类型(字符串除外)是值类型,在堆栈而不是堆上创建。当它们超出范围时,会从堆栈中弹出;它们不是垃圾收集的


字符串是引用类型,在堆上分配,并进行垃圾收集。NET使用对字符串的内存管理执行一些优化。(也就是说,内存中可能只有一个字符串“”的实例..NET可以这样做,因为字符串是不可变的)

对于已经给出的两个答案,除此之外,我无法添加太多内容,这就很好地描述了垃圾收集在.NET中的工作方式。

好的,只有两个答案,已经有错误信息了

  • 字符串不是基元类型
  • 字符串不是值类型
  • 值类型值并不总是在堆栈上创建的,这取决于变量所在的位置。如果它是类的一部分,它将与该对象的其余数据一起存储在堆上
  • 如果捕获了局部变量(例如,在匿名函数和迭代器块中),则即使是局部变量也可能最终出现在堆上
  • 诸如“”之类的字符串文字被插入-它们总是解析为同一个字符串。该循环实际上不会创建任何字符串

有关更多信息,请参阅我的文章。您可能还需要考虑。

不是:“原始类型是布尔、字节、SbEnter、It16、UnT16、It32、Unt32、It64、Unt64、UntPtR、Char、双、单。”我相信,在VB规范上)和Type(String)。ISBr原族肯定返回false。C#规范只使用了两次“primitive”这个词,而且在任何情况下都没有定义这个词。ECMA-335没有定义它,但分区III的第1.8.1.1节提到装箱一个原语类型值,它不适用于字符串。同样,你是对的,我很快讲了两个,并且做了一个太笼统的声明。我知道我的意思,但没有很好地表达出来。很好的回答(再次):)那么对于vb.net windows应用程序来说,因为所有代码都在一个对象上,所以很可能都在堆上,并且创建一个保存数据的对象与保存相同数据的结构的效率根本不太重要?除了通过val传递结构而不获取数据的可能性之外?不。不是所有东西都在对象中(根据C#对“object”的定义——类的实例,包括用于装箱值类型的类型)。并不是所有的东西都在堆上-请阅读链接。值类型的局部变量通常将其数据存储在堆栈上。(续)