gpt4 book ai didi

c# - Try-Finally Dispose 和 Using-statement 的区别

转载 作者:太空狗 更新时间:2023-10-29 23:22:37 25 4
gpt4 key购买 nike

我一直在深入研究 Microsoft 的代码分析,偶然发现了一些非常有趣的东西。 .NET 似乎使用两种不同类型的 Dispose,具体取决于它的调用方式。采取以下两个选项:

public void SqlConnectionUsing()
{
using (SqlConnection connection = new SqlConnection())
{
}
}

public void SqlConnectionFinally()
{
SqlConnection connection = new SqlConnection();
try
{
}
finally
{
connection.Dispose();
}
}

这两个选项被翻译成完全相同的东西;在编译期间。 using 变成了 try-finally 语句,在 finally 语句中调用了 Dispose 方法。

我说的是一个处置方法;因为哪种处置方法取决于您编写代码的方式。

当使用 using-statement 时,调用会转到 callvirt instance void [mscorlib]System.IDisposable::Dispose()(它是确切的 IL-线)。

并手动采用 try-finally 选项,dispose-statement 更改为:callvirt instance void [System]System.ComponentModel.Component::Dispose()

为什么调用的 dispose 函数不同?

如果需要,我可以添加整个 IL 代码。

最佳答案

在编译期间,using 语句转换为:

try
{
}
finally
{
((IDisposable)connection).Dispose();
}

您实际上可以在同一个类中定义两个 Dispose() 方法,一个显式用于 IDisposable 接口(interface),一个是类方法:

public class X : IDisposable
{
void IDisposable.Dispose() { }
public void Dispose() { }
}

不过,如果让这些方法具有不同的行为,您可能真的会毁了某人的一天。

此外,您可以在未实现 IDisposable 的类中创建一个 Dispose() 方法,但您不能将它放在一个 使用语句。

关于c# - Try-Finally Dispose 和 Using-statement 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25034379/

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