我一直在深入研究微软的Code Analysis,偶然发现了一些非常有趣的东西..NET似乎使用两种不同类型的Dispose,具体取决于它的调用方式.请选择以下两个选项:
public void SqlConnectionUsing()
{
using (SqlConnection connection = new SqlConnection())
{
}
}
public void SqlConnectionFinally()
{
SqlConnection connection = new SqlConnection();
try
{
}
finally
{
connection.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
这两个选项都被翻译成完全相同的东西; 在编译期间.using成为一个try-finally语句,在finally语句中调用Dispose方法.
我说一个处置法; 因为什么样的dispose方法取决于你编写代码的方式.
当去的时候using-statement,一个电话就到了callvirt instance void [mscorlib]System.IDisposable::Dispose()(这是确切的IL线).
并手动执行try-finally选项,dispose语句更改为:callvirt instance void [System]System.ComponentModel.Component::Dispose().
为什么调用dispose函数会有区别?
如果需要,我可以添加整个IL代码.
在编译过程中,该using语句翻译为:
try
{
}
finally
{
((IDisposable)connection).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
实际上,您可以Dispose()在同一个类中定义两个方法,一个是为IDisposable接口显式定义的方法,另一个是类方法:
public class X : IDisposable
{
void IDisposable.Dispose() { }
public void Dispose() { }
}
Run Code Online (Sandbox Code Playgroud)
不过,如果让这些方法有不同的行为,你真的可能会毁掉某人的一天。
此外,您可以Dispose()在不实现的类中创建方法IDisposable,但无法将其放在using语句中。
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |