2010-02-06 14 views
6

... si j'utilise un IDisposable dans une variable locale, mais n'appelle pas Dispose() ou utilise le pattern using().Existe-t-il une règle FxCop pour les IDisposables locaux utilisés?

public void BadMethod() 
{ 
    var fs = new FileStream("file.txt", FileMode.Create); 
    fs.WriteByte(0x55); 
    // no dispose, no using() 
} 

Tout comme la règle "Types that own disposable fields should be disposable" pour les champs.


EDIT: Remplacée par MemoryStream FileStream, car MemoryStream alloue seulement la mémoire et ne pas utiliser les ressources (non gérés), de sorte que quelqu'un pourrait discuter d'un appel Dispose() obligatoire.

+1

Pourquoi voudriez-vous cela? C'est inutile, la mémoire n'est pas jetable. Si tout va bien nous n'obtiendrons pas un outil qui le dit, il détruira des esprits de programmeur irrémédiablement. –

+8

@nobugz: Il est toujours correct d'appeler Dispose sur MemoryStream. Le fait que MemoryStream n'utilise aucune ressource non gérée est un détail de * implementation *. Le ** contrat ** pour MemoryStream dit qu'il implémente IDisposable, et en tant que tel, il devrait toujours avoir Dispose appelé. Il est toujours préférable de coder le contrat par rapport aux détails d'implémentation spécifiques. – casperOne

+0

@capser: oui, certains programmeurs aiment la Machine pour leur dire quoi faire. C'est une religion à laquelle je ne souscris pas, je préfère briser le rulez sciemment. Allez-y et faites-le à votre façon, vous n'aurez jamais tort. Simplement lent. –

Répondre

15

Existe-t-il une règle FxCop pour cela? Oui et non.

Dans FxCop 1.35, sur lequel est basé Visual Studio 2005 Code Analysis, il y avait une règle DisposeObjectsBeforeLosingScope qui faisait exactement cela.

Dans FxCop 1,36 (Visual Studio 2008 Code Analysis), ils ont retiré leur moteur d'analyse de flux de données, ce qui signifie que cette règle devait également être supprimée.

Cependant, dans la prochaine FxCop (Visual Studio 2010 Analyse du code), il semble que DisposeObjectsBeforeLosingScope est de retour!

+0

+1. Je ne savais pas qu'il a été ajouté à 2010. Bien que je ne suis pas nécessairement d'accord avec la règle, c'est une réponse directe à la question. –

+0

BTW: Sur votre deuxième lien: Que signifie "retourner un objet jetable nécessite que l'objet est construit dans un bloc try/finally en dehors d'un bloc d'utilisation" signifie ?? – ulrichb

+1

Ils couvrent en fait cela dans l'échantillon de cet article. Regardez la méthode 'OpenPort2'. Fondamentalement, si l'objet est construit mais ne parvient pas à s'initialiser, il devrait être 'Dispose()' 'd avant de lancer l'exception à l'utilisateur (sinon il sortira de la portée). Un 'using 'ne serait pas approprié ici parce que le * appelant * devrait appeler' Dispose() 'à un moment ultérieur. – bobbymcr