无用存储单元收集器是因为中间语言是为处理该过程而工作的。其规则要求,第一,不能引用已有的对象,除百复制已有的引用。第二,中间语言的类型安全的语言。在这里,其含义是如果存在对对象的任何引用,该引用中就有足够的信息来确定对象的类型。
无用存储单收集机制不能和诸如未受管制的
C
++这样的语言一起使用,因为
C
++允许在类型之间使用指针自由地转换数据类型。这样,搜索代码的程序就找不到指针的值,不能获得足够的信息来确定堆的什么区域正在使用。如前氘核,
IL
还允许在不安全的代码中使用指针,以及在指针之间转换数据类型。但使用
IL
,会严格限制使用这些指针的方式,以确保在代码中使用的指针不与无用存储单元收集器的需求冲突。特别是指针不允许设置为指向引用对象。
无用存储单元收集器的一个重要方面是它是不确定的。换言这,不能保证什么时候会调用无用存储单元收集器;
.NET
运行时决定需要它时,就可以调用它。显然,代码对内存的需求越多,无用存储单元收集器的调用次数就越多。但其次数是可以预计的。在代码中,可以使用
.NET
基类
System.GC
显式地调用无用存储单收集器,例如,可以在代码使用完大量的变量后调用它。但在大多数情况下,只需委托
.NET
运行时在合适的时候调用无用存储单元收集器即可。