Ce n'est pas le cas. La déclaration using
le fait pour vous.
Selon MSDN, cet exemple de code:
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
est dilatée, lors de la compilation, le code suivant (notez les accolades supplémentaires pour créer la portée limitée de l'objet):
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
note: Comme @timvw mentioned, si vous chaînez des méthodes ou utilisez des initialiseurs d'objet dans l'instruction using elle-même et qu'une exception est levée, l'objet ne sera pas éliminé. Ce qui est logique si vous regardez à quoi il va être étendu. Par exemple:
using(var cat = new Cat().AsDog())
{
// Pretend a cat is a dog
}
se développe pour
{
var cat = new Cat().AsDog(); // Throws
try
{
// Never reached
}
finally
{
if (cat != null)
((IDisposable)cat).Dispose();
}
}
AsDog
va évidemment lancer une exception, car un chat ne peut jamais être aussi impressionnant comme un chien. Le chat ne sera alors jamais éliminé. Bien sûr, certaines personnes peuvent prétendre que les chats ne devraient jamais être éliminés, mais c'est une autre discussion ...
De toute façon, assurez-vous que ce que vous faites using(here)
est sûr et vous êtes prêt à partir. (Evidemment, si le constructeur échoue, l'objet ne sera pas créé pour commencer, donc pas besoin de disposer).
J'aime ce genre de questions apparemment simples sur StackOverflow. Je suis toujours surpris de la quantité d'informations que vous pouvez obtenir sur une telle question. Je ne connaissais pas le problème des initialiseurs d'objets ... –
SO est définitivement un site génial. Je me plais beaucoup ici. –