参考对象是否会被丢弃?

Yij*_*sei 0 .net c# idisposable

如果"objectToBeDisposed"的引用是由"useDisposableObject"保存的,我可以知道它是否会被处理掉?

using(IDisposable objectToBeDisposed = new ObjectImplementedIDisposable  ()){
ChildObject useDisposableObject = new ChildObject(objectToBeDisposed);
.... doing stuff with useDisposableObject;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*don 7

是的,在您的示例中,它将被释放,因为using块Dispose()在离开该块时显式调用该方法.

另外,引用对象位于使用块范围内,并且将在使用块的末尾超出范围,这将避免在引用对象在处置后尝试使用它时访问已处置对象的潜在问题.

感谢@dlev更新

  • 正确的答案,虽然错误的推理:`objectToBeDisposed`将被处置,无论哪个对象引用它,这就是`using`块所做的.是否*GCed*是一个不同的故事,但完全与它是否处置无关. (2认同)

Sal*_*iti 5

在.NET世界中,处理,终结和内存释放是完全不同的三件事.

处置只是一种"应用逻辑"的东西,它是通过一次性模式实现的.如果实现接口IDisposable,则您的对象可以与using关键字一起使用.

using关键字将以简单的方式翻译:

using (IDisposable xxx = new MyObject())
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

手段

{
    IDisposable xxx = new MyObject();
    try
    {
        ....
    }
    finally
    {
        if (xxx != null)
            xxx.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

这没有其他魔力.就这样.

当应该释放对象时,对象终结将由垃圾收集器调用.它发生的时间和析构函数之间的顺序是不可预测的.

class myclass { ~myclass() { this code will be called by garbage collector, i cannot call it } }
Run Code Online (Sandbox Code Playgroud)

语法与C++析构函数非常相似,但含义有很大不同.

然后记忆释放.内存释放与对象处理无关!您可以永远保持对已处置对象的引用.处置只是与应用程序逻辑相关的事情.

也可以通过垃圾收集器多次取消或调用析构函数(请参阅GC.RegisterForFinalize和GC.SuppressFinalize).类中析构函数的存在会减慢垃圾收集器的速度,而在析构函数中,除了释放非托管资源之外,几乎什么都不做.

相反,正如我说的那样是处理应用程序,只是一种方法,与垃圾收集器无关.