C# 将Idisposable作为参数传递

C# 将Idisposable作为参数传递,c#,garbage-collection,idisposable,C#,Garbage Collection,Idisposable,在下面,我将在构造函数中传递一个一次性对象作为参数,然后执行一些操作,就这样。构造函数除了设置DisposableObject的局部变量实例外,什么也不做 我相信即使在Whatever()调用中出现异常的情况下,一次性文件仍然会被处理,这对吗 如果代码在for循环中,这两个对象也会超出范围并被垃圾收集(我的应用程序域中只能有一个IDisposable类的实例) 只是想澄清一下:IDisposable不是关于垃圾收集,而是关于资源管理的更大主题。一个简单的例子可能是SqlConnection,它用

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

我相信即使在Whatever()调用中出现异常的情况下,一次性文件仍然会被处理,这对吗


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


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

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


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

此代码:

using(var disposable = new DisposableObject())
{
    ...
}
本质上等同于此代码:

var disposable = new DisposableObject();

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

Dispose总是被调用,除非对对象的引用丢失。

是的,如果创建了
disposableObject
,实例将被释放。“我的应用程序域中只能有一个IDisposable类的实例”这似乎是一个奇怪的设计选择。我们不能保证GC(垃圾收集器)会运行(更不用说收集实例了)@Zahar Peled,我同意,但它是第三方对象我无法控制你认为什么会让引用“丢失”?
一次性的(在你的示例中)在
的主体中使用
是只读的,所以它不像是可以分配给
null
。谢谢Paul。是的,我并不是想在那里添加GC来混水。DisposableObject类实际上是一个第三方类,它抛出一个异常,声称不能有多个实例。我想100%我在做legit代码。我认为第三方类中有一些东西与上述代码无关。(由于与问题无关的原因,我还需要多次重新创建该类)@Damien_不信者在
try finally
的情况下,如果要为
一次性
字段分配新值,则原始值将丢失且无法处理。
var disposable = new DisposableObject();

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