Les autres réponses au sujet de la panne de courant, Environment.FailFast()
, les itérateurs ou de la tricherie en using
quelque chose, c'est - null
sont tous intéressants. Mais je trouve curieux que personne n'a mentionné ce que je pense est la situation la plus courante lors de l' Dispose()
ne sera pas appelé, même en présence d' using
: lorsque l'expression à l'intérieur d' using
déclenche une exception.
Bien sûr, ce qui est logique: l'expression en using
a déclenché une exception, si l'affectation n'a pas lieu et il n'y a rien que l'on pourrait appeler Dispose()
sur. Mais le jetable objet peut déjà exister, même si elle peut être en demi-état initialisé. Et même dans cet état, il peut déjà tenir certaines ressources non managées. C'est une autre raison pourquoi mettre correctement en œuvre le modèle jetable est important.
Exemple de code posant problème:
using (var f = new Foo())
{
// something
}
…
class Foo : IDisposable
{
UnmanagedResource m_resource;
public Foo()
{
// obtain m_resource
throw new Exception();
}
public void Dispose()
{
// release m_resource
}
}
Ici, on dirait qu' Foo
communiqués m_resource
correctement et nous utilisons using
correctement. Mais l' Dispose()
sur Foo
n'est jamais appelée, en raison de l'exception. La solution dans ce cas est d'utiliser l'outil de finalisation et de la libération de la ressource, il y a trop.