在下面,我将一个一次性对象作为构造函数中的参数传递,然后执行一些操作即可。构造函数除了设置DisposableObject的局部变量实例外什么也不做。
我是否可以相信即使在Whatever()调用中出现异常的情况下,一次性用品仍会被处置?
如果代码在for循环中,则两个对象也将超出范围并被垃圾回收(在我的App Domain中,我只能拥有这个IDisposable类的一个实例)。
using (var disposableObject = new DisposableObject())
{
var simpleObject= new Simple(disposableObject);
simpleObject.Whatever();
}
答案 0 :(得分:0)
只需澄清一下:IDisposable
与垃圾回收无关,而与资源管理的更大主题有关。一个简单的示例可能是SqlConnection
,它用于释放与数据库的连接。 SqlConnection
对象仍然保留在内存中,并且超出范围后会被垃圾回收。
这对解决“每个AppDomain实例个实例”的问题无济于事,因为对象的生存期不受您控制。最多只能有一个未处理的对象。
using
语句实际上是try-finally
块,其中finally
始终运行以确保对象被处置。
此代码:
using(var disposable = new DisposableObject())
{
...
}
基本上等同于以下代码:
var disposable = new DisposableObject();
try
{
...
}
finally
{
disposable?.Dispose();
}
始终调用Dispose,除非丢失对该对象的引用。