me he encontrado ildasm para encontrar que esto:curioso C# expansión mediante declaración
using(Simple simp = new Simple())
{
Console.WriteLine("here");
}
genera código IL que es equivalente a esto:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
if(simp != null)
{
simp.Dispose();
}
}
y la pregunta es ¿por qué diablos lo hace comprobar nulo en el finalmente? El bloque finally solo se ejecutará si se ejecuta el bloque try, y el bloque try solo se ejecutará si el constructor Simple tiene éxito (es decir, no lanza una excepción), en cuyo caso simp será no nulo. (Si hay algún temor de que algunos pasos intermedios puedan venir entre el constructor Simple y el comienzo del bloque try, entonces eso sería realmente un problema porque entonces podría lanzarse una excepción que evitaría que el bloque finally se ejecute). Entonces, ¿por qué demonios?
Dejando a un lado (por favor) el argumento de si la instrucción using es mejor que tratar, por último, escribo mis try-finally bloques como:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
simp.Dispose();
simp = null; // sanity-check in case I touch simp again
// because I don't rely on all classes
// necessarily throwing
// ObjectDisposedException
}
Tengo curiosidad por una cosa: cómo "caro" es ese control de cordura adicional (simp = null) en comparación con el control de cordura generado por el compilador, en términos de rendimiento? Al final, la diferencia entre esos dos parece más filosófica que práctica, pero puedo estar equivocado. Debate interesante de cualquier manera. –
@Fredrik - ¿Entonces está preguntando si "establecer en nulo" es más rápido/más lento que "comparar con nulo"? No estoy seguro.Aparte de eso, un beneficio de la sentencia using es que no tiene que preocuparse de que se acceda a ese objeto fuera del ámbito de uso. (A menos que tenga otra referencia). – dss539
"¿Por qué demonios se anota nulo en el final?" No hay una buena razón. Saltarse la verificación nula es una optimización que podríamos haber realizado. Nosotros no. No realmente un gran acuerdo; los controles nulos son cortos y baratos. –