11
votes

Pourquoi utiliser (NULL) un cas valide en C #?

Quelqu'un pourrait-il vous expliquer pourquoi le code présenté ci-dessous est valide en C # et exécute l'appel à console.writeline code>?

((IDisposable)null).Dispose();
IL_0023:  ldnull
IL_0024:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()


3 commentaires

Hmmm ... je suis maintenant très douteux de ce post, donné le récent blog d'Eric ... est-ce vraiment une véritable question?


N'est-ce pas déjà demandé? Stackoverflow.com/questions/2522822 / ...


Oui, ça me semblait artificiel.


3 Réponses :


16
votes

La spécification de la langue indique explicitement (8.13) que la valeur capturée est testée pour NULL si nécessaire, c'est-à-dire que le enfin code> est essentiellement (avec des caves autour des types non nullables)

IEnumerable blah = ...; // note non-generic version
IEnumerator iter = blah.GetEnumerator();
using(iter as IDisposable)
{
    // loop
}


2 commentaires

Merci pour une belle astuce avec comme Idisposable . Exactement ce que je cherchais.


C'est trop intelligent pour mon goût :)



1
votes

Je pense que c'est un résultat naturel du cas plus général de en utilisant (quelque_expression) , où quelque_expression est autorisé à évaluer à null .

Il aurait nécessité une règle spéciale de distinguer ce cas de plus général.


0 commentaires

0
votes

3 commentaires

Où dit-il que dans la documentation que vous avez liée? Une recherche sur null sur cette page renvoyée 0 hits.


Dans la section des remarques. Si (Font1! = NULL) ((Idisposable) FONT1) .Dispose ();


> Une déclaration utilisée est traduite en trois parties: acquisition, utilisation et élimination. L'utilisation de la ressource est implicitement jointe dans une énoncé d'essai qui inclut enfin une clause. Cette clause élève enfin la ressource. Si une ressource NULL est acquise, aucun appel à disposer n'est effectué et aucune exception n'est lancée. msdn.microsoft.com/en-us/library /AA664736(V=VS.71).aspx