我一直在钻研微软的代码分析,偶然发现了一些非常有趣的东西。根据调用方式,.NET似乎使用了两种不同类型的处置。采取以下两种选择:
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码加进去。
发布于 2014-07-30 10:27:26
在编译期间,using语句转换为:
try
{
}
finally
{
((IDisposable)connection).Dispose();
}实际上,您可以在同一个类中定义两个Dispose()方法,一个显式地用于IDisposable接口,另一个用于类方法:
public class X : IDisposable
{
void IDisposable.Dispose() { }
public void Dispose() { }
}不过,如果让这些方法有不同的行为,你可能会毁了一个人的一天。
此外,您可以在不实现Dispose()的类中创建IDisposable方法,但不能将其放在using语句中。
发布于 2014-07-30 10:30:21
这是因为using总是使用IDisposable.Dispose()并从那里向上(因此它实际上是一个接口方法调用)。
它实际上是:
using (IDisposable x = ...)
{ }最后,您实际上是在调用Component.Dispose()方法,因为这是SqlConnection的最高可用Dispose方法。
https://stackoverflow.com/questions/25034379
复制相似问题