Я погрузился в анализ кода Microsoft и наткнулся на кое-что довольно интересное. .NET, кажется, использует два разных типа Dispose, в зависимости от того, как он называется. Возьмите следующие два варианта:
public void SqlConnectionUsing()
{
using (SqlConnection connection = new SqlConnection())
{
}
}
public void SqlConnectionFinally()
{
SqlConnection connection = new SqlConnection();
try
{
}
finally
{
connection.Dispose();
}
}
Оба варианта переводятся в одно и то же; во время компиляции. Использование становится оператором try-finally с внутри оператора finally вызовом метода Dispose.
Я говорю метод удаления; потому что метод удаления зависит от того, как вы написали свой код.
При переходе на using-statement
вызов идет на callvirt instance void [mscorlib]System.IDisposable::Dispose()
(это точная IL-линия).
И вручную выбрав опцию try-finally, оператор dispose изменится на: callvirt instance void [System]System.ComponentModel.Component::Dispose()
.
Почему существует разница в том, какая функция dispose вызывается?
При необходимости могу добавить весь IL-код.