将 IDisposable 作为参数传递

Passing IDisposable as parameter

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

即使在 Whatever() 调用出现异常的情况下,一次性物品仍会被处理掉,我的看法是否正确?

如果代码在 for 循环中,两个对象也会超出范围并被垃圾收集(我的应用程序域中只能有一个此 IDisposable class 的实例)。

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

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

这对您的 "one-instance-per-AppDomain" 问题没有帮助,因为对象的生命周期不受您控制。最多你可以有一个非处理对象。


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

此代码:

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

本质上等价于这段代码:

var disposable = new DisposableObject();

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

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