¿Podría alguien explicarme por qué el código que se muestra a continuación es válido en C# y ejecuta la llamada al Console.WriteLine
?¿Por qué usar (nulo) un caso válido en C#?
using (null)
{
Console.WriteLine ("something is here")
}
Se compila en (finalmente se muestra el bloque). Como puede ver, el compilador decide no ejecutar el método Dispose()
y salta a la instrucción 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
Sin embargo, si se me acaba el código siguiente, se producirá un error con un NullReferenceException
(que se espera):
((IDisposable)null).Dispose();
IL_0023: ldnull
IL_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
Por qué se compila la primera versión? ¿Por qué el compilador decide no ejecutar Dispose()
? ¿Hay algún otro caso en el que el compilador decida no llamar al Dispose()
en un bloque using
?
hmmm ... Ahora estoy muy dudosa de este post, dada reciente blog de Eric ... ¿es realmente una pregunta genuina? –
¿No es esto ya preguntado? http://stackoverflow.com/questions/2522822/c-using-statement-with-a-null-object –
Sí, parecía artificial para mí. –