将 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,除非对象的引用丢失。
在下文中,我将一个一次性对象作为构造函数中的参数传递,然后执行一些操作,仅此而已。构造函数除了设置 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,除非对象的引用丢失。