有没有办法来检测一个对象是否调用了GC.SuppressFinalize?我可以检测一个对象是否调用了GC.SuppressFinalize?
我有一个对象,它看起来像这样(省略掉了清晰全面的Dispose模式):
public class ResourceWrapper {
private readonly bool _ownsResource;
private readonly UnmanagedResource _resource;
public ResourceWrapper(UnmanagedResource resource, bool ownsResource) {
_resource = resource;
_ownsResource = ownsResource;
if (!ownsResource)
GC.SuppressFinalize(this);
}
~ResourceWrapper() {
if (_ownsResource)
// clean up the unmanaged resource
}
}
如果ownsResource
构造函数的参数是false
,那么将终结无关 - 这样这似乎是合理的(如果有点古怪)从构造函数中调用GC.SuppressFinalize
。但是,因为这种行为很古怪,所以我很想在XML文档注释中记下它......如果我试图对它进行评论,那么我应该为它写一个单元测试。
不过,虽然System.GC有方法来设置对象的finalizability(SuppressFinalize,ReRegisterForFinalize),我看不出有什么方法来得到对象的finalizability。有没有什么方法可以查询GC.SuppressFinalize是否在给定的实例上被调用,缺少购买Typemock或写我自己的CLR主机?
一些BCL类实际上是从其构造函数中执行SuppressFinalize,例如, SqlConnection(尽管我没有看到任何有条件的)。 – 2011-01-08 16:42:38