将Idisposable作为参数传递

时间:2018-10-22 11:59:47

标签: c# garbage-collection idisposable

在下面,我将一个一次性对象作为构造函数中的参数传递,然后执行一些操作即可。构造函数除了设置DisposableObject的局部变量实例外什么也不做。

我是否可以相信即使在Whatever()调用中出现异常的情况下,一次性用品仍会被处置?

如果代码在for循环中,则两个对象也将超出范围并被垃圾回收(在我的App Domain中,我只能拥有这个IDisposable类的一个实例)。

using (var disposableObject = new DisposableObject()) 
{
    var simpleObject= new Simple(disposableObject);
    simpleObject.Whatever();
}

1 个答案:

答案 0 :(得分:0)

只需澄清一下:IDisposable与垃圾回收无关,而与资源管理的更大主题有关。一个简单的示例可能是SqlConnection,它用于释放与数据库的连接。 SqlConnection对象仍然保留在内存中,并且超出范围后会被垃圾回收。

这对解决“每个AppDomain实例个实例”的问题无济于事,因为对象的生存期不受您控制。最多只能有一个未处理的对象。


using语句实际上是try-finally块,其中finally始终运行以确保对象被处置。

此代码:

using(var disposable = new DisposableObject())
{
    ...
}

基本上等同于以下代码:

var disposable = new DisposableObject();

try
{
    ...
}
finally
{
    disposable?.Dispose();
}

始终调用Dispose,除非丢失对该对象的引用。