Кто-нибудь, пожалуйста, объясните мне, почему показанный ниже код действителен на C # и выполняет вызов to Console.WriteLine
?
using (null)
{
Console.WriteLine ("something is here")
}
Он компилируется в (показан блок finally). Как вы можете видеть, компилятор решает не выполнять метод Dispose ()
и переходит к ] endfinally
.
IL_0013: ldnull
IL_0014: ceq
IL_0016: stloc.1
IL_0017: ldloc.1
IL_0018: brtrue.s IL_0021 // branches here and decide not to execute Dispose()
IL_001a: ldnull
IL_001b: callvirt instance void [mscorlib]System.IDisposable::Dispose()
IL_0020: nop
IL_0021: endfinally
Однако, если я запустил следующий код, он завершится с ошибкой NullReferenceException
(что ожидается):
((IDisposable)null).Dispose();
IL_0023: ldnull
IL_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
Почему компилируется первая версия? компилятор решает не выполнять Dispose ()
? Есть ли другие случаи, когда компилятор может решить не вызывать Dispose ()
в с использованием блока
?