J'ai couru ildasm de constater que ceci:Curieux C# en utilisant l'expansion de l'instruction
using(Simple simp = new Simple())
{
Console.WriteLine("here");
}
génère du code IL qui est équivalent à ceci:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
if(simp != null)
{
simp.Dispose();
}
}
et la question est pourquoi diable il fait vérifier null dans le finalement? Le bloc finally ne sera exécuté que si le bloc try est exécuté, et le bloc try ne sera exécuté que si le constructeur Simple réussit (c'est-à-dire qu'il ne lance pas d'exception), auquel cas simp sera non nul. (S'il y a une certaine crainte que certaines étapes interviennent entre le constructeur Simple et le début du bloc try, alors ce serait vraiment un problème car alors une exception pourrait être lancée qui empêcherait le bloc finally de s'exécuter du tout.) Alors, pourquoi diable?
Mettant de côté (s'il vous plaît) l'argument de savoir si la déclaration à l'aide est mieux que d'essayer-enfin, je vous écris mes try-finally blocs comme:
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
}
Je suis curieux de savoir une chose: comment "cher" est ce contrôle supplémentaire (simp = null) par rapport à la vérification de la santé mentale générée par le compilateur, en termes de performance? En fin de compte, la différence entre les deux semble plus philosophique que pratique, mais je peux me tromper. Discussion intéressante de toute façon. –
@Fredrik - Vous demandez si "set to null" est plus rapide/plus lent que "compare to null"? Je ne suis pas sûr.En dehors de cela, un avantage de l'instruction using est que vous n'avez pas à vous soucier de l'accès à cet objet en dehors de la portée d'utilisation. (À moins que vous n'ayez une autre référence.) – dss539
"Pourquoi diable vérifie-t-il null dans le dernier?" Aucune bonne raison. Ignorer la vérification null est une optimisation que nous aurions pu effectuer. Nous n'avons pas. Pas vraiment une grosse affaire; Les chèques nuls sont courts et bon marché. –