gpt4 book ai didi

c# - 如果使用 `using` 语句,什么时候需要调用 IDisposable?

转载 作者:太空狗 更新时间:2023-10-29 23:53:45 26 4
gpt4 key购买 nike

我正在阅读另一个答案。这让我想知道,如果我正在使用 using 语句,什么时候需要显式调用 Dispose?

编辑:

只是为了证明自己不是一个完全无知的人,我问的原因是因为另一个线程上有人说了一些暗示必须手动调用 Dispose 的充分理由......所以我想,为什么不问一下是吗?

最佳答案

你不知道。 using 语句为您完成。


根据 MSDN ,此代码示例:

using (Font font1 = new Font("Arial", 10.0f)) 
{
byte charset = font1.GdiCharSet;
}

在编译时被扩展为以下代码(注意额外的大括号为对象创建了有限的范围):

{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}

注:@timvw mentioned ,如果您在 using 语句本身中链接方法或使用对象初始值设定项并且抛出异常,则该对象将不会被释放。如果你看看它将扩展到什么,这是有道理的。例如:

using(var cat = new Cat().AsDog())
{
// Pretend a cat is a dog
}

扩展为

{
var cat = new Cat().AsDog(); // Throws
try
{
// Never reached
}
finally
{
if (cat != null)
((IDisposable)cat).Dispose();
}
}

AsDog 显然会抛出一个异常,因为猫永远不可能像狗一样棒。这只猫将永远不会被处理掉。当然,有些人可能会争辩说猫不应该被丢弃,但那是另一个讨论......

无论如何,只需确保您使用( here ) 所做的事情是安全的,您就可以开始了。 (显然,如果构造函数失败,则不会创建对象,因此无需处置)。

关于c# - 如果使用 `using` 语句,什么时候需要调用 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/545062/

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