首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试-最终处理和使用-语句之间的区别

尝试-最终处理和使用-语句之间的区别
EN

Stack Overflow用户
提问于 2014-07-30 10:21:52
回答 2查看 1.7K关注 0票数 5

我一直在钻研微软的代码分析,偶然发现了一些非常有趣的东西。根据调用方式,.NET似乎使用了两种不同类型的处置。采取以下两种选择:

代码语言:javascript
复制
public void SqlConnectionUsing()
{
    using (SqlConnection connection = new SqlConnection())
    {
    }
}

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

在编译期间,这两个选项都被转换为完全相同的东西。using变成了try- inside语句,其中包含了对Dispose-方法的调用。

我说是一个dispose-方法;因为什么样的dispose方法取决于您编写代码的方式。

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

并且手动使用try-finally选项,dispose-语句将更改为:callvirt instance void [System]System.ComponentModel.Component::Dispose()

为什么在调用什么dispose函数时会有区别?

如果需要的话我可以把整个IL码加进去。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-30 10:27:26

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

代码语言:javascript
复制
try
{
}
finally
{
    ((IDisposable)connection).Dispose();
}

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

代码语言:javascript
复制
public class X : IDisposable
{
    void IDisposable.Dispose() { } 
    public void Dispose() { }
}

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

此外,您可以在不实现Dispose()的类中创建IDisposable方法,但不能将其放在using语句中。

票数 4
EN

Stack Overflow用户

发布于 2014-07-30 10:30:21

这是因为using总是使用IDisposable.Dispose()并从那里向上(因此它实际上是一个接口方法调用)。

它实际上是:

代码语言:javascript
复制
using (IDisposable x = ...)
{ }

最后,您实际上是在调用Component.Dispose()方法,因为这是SqlConnection的最高可用Dispose方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25034379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档