Гмурках се в анализа на кода на 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-метод.
Казва метод за изхвърляне; защото какъв вид dispose-метод зависи от начина, по който сте написали своя код.
Когато отивате към using-statement
, повикването отива към callvirt instance void [mscorlib]System.IDisposable::Dispose()
(това е точната IL-линия).
И ръчно вземайки опцията try-finally, операторът dispose се променя на: callvirt instance void [System]System.ComponentModel.Component::Dispose()
.
Защо има разлика в извикването на функцията dispose?
Мога да добавя целия IL-код, ако е необходимо.