gpt4 book ai didi

c# - 如果在处置之前复制 IDisposable 的引用,IDisposable 是否仍会被处置?

转载 作者:行者123 更新时间:2023-11-30 13:46:02 26 4
gpt4 key购买 nike

考虑一下:

interface IFoo : IDisposable { }

class Program
{
static void Main()
{
var foo = GetFoo();

var anotherFoo = foo;

using(anotherFoo)
{
}

// Will the object on the heap be marked for collection?
// Or will this confuse the garbage collector
// as we are copying references?
}
}

这提出了更重要的问题。 Dispose() 实际上做了什么?

最佳答案

Dispose 方法是考虑到托管内存以外的资源(非托管资源)仍然需要显式释放; GC 不是专门为它设计的。

此外,IDisposable 背后的机制独立于 GC。当您关注 Dispose Pattern ,您可以选择将您的代码插入 GC,方法是使您的类可终结,但您不必在实现 IDisposable 的过程中这样做。

Disposing 与清理对象持有的隐藏资源有关,而不是对象在托管内存中的“外壳”。一个对象经常会抛出 ObjectDisposedException 在调用 Dispose 之后尝试使用它。

回到您的代码,因为这两个变量实际上引用同一个对象,所以 foo 变量将在 using block 之后引用已释放的对象。因此,在 using 之后调用方法或访问 foo 的属性可能会引发异常:

var foo = GetFoo();

var anotherFoo = foo;

using(anotherFoo)
{
}

foo.doSomethingUseful(); // <<== This may throw ObjectDisposedException!

关于c# - 如果在处置之前复制 IDisposable 的引用,IDisposable 是否仍会被处置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com