2009-06-02 5 views
5

Cela peut sembler être une question noddy, mais je regardais cela parce que j'ai entendu quelqu'un affirmer que vous devez appeler Close() sur un FileStream, même si c'est dans un block (et ils ont un code où Close() est appelé juste à la fin du bloc). Je sais que Close() est censé appeler Dispose(), mais je pensais que je regarderais plus profondément puisque c'est le code .Net 1.1, et la majeure partie de mon expérience a été avec 2.0 sur. Une chose qui m'a frappé, c'est que la documentation MSDN pour FileStream a Dispose() et Dispose (bool) pour .Net 2.0, mais seulement Dispose (bool) pour .Net 1.1. Je pensais que cela pouvait être un oubli, donc j'ai utilisé Reflector pour regarder dans un assemblage - et là aussi, je vois Dispose (bool), mais pas Dispose().Comment IDisposable est-il implémenté sur FileStream dans .Net 1.1

Est-ce correct? Si oui, quelle est l'histoire ici? FileStream fonctionne dans un bloc using - que je pensais signifier qu'il doit implémenter IDisposable qui, à ma connaissance seulement déclare Dispose().

Y at-il un peu de magie du compilateur en cours, ou suis-je manque une mise en œuvre cachée de Dispose() quelque part (qui, vraisemblablement, appelle Dispose (true) ou Dispose (false)?)

Enfin (sans jeu de mots), pouvez-vous confirmer que la délimitation d'un FileStream à l'aide de block fermera le flux à la sortie de la portée dans .Net 1.1?

[modifier]

Juste pour clarifier les choses, ce code est C#. Je comprends que VB.Net n'a pas obtenu l'instruction using jusqu'à. Net 2.0, mais ma compréhension est que C# l'avait dans 1.1 (et mon code 1.1 l'a et il compile)

+0

Il est documenté pour .Net 1.1 ici: http://msdn.microsoft.com/en-us/library/yh598w02(VS.71).aspx. De plus, j'ai du code devant moi dans VS2003, ciblant .Net 1.1, qui utilise des blocs. – philsquared

+0

doit avoir été VB.NET qui l'a eu dans 2.0 alors .... –

+0

... c'est-à-dire que le C# qui cible .Net 1.1 - using est une fonctionnalité de langage qui, AFAIK, ne nécessite aucun support supplémentaire du runtime. Je sais que VB.Net n'a pas compris jusqu'à .Net 2.0 – philsquared

Répondre

9

Il a mis en application un peu drôle , mais c'est là: La classe de base pour FileStream: System.IO.Stream implémente IDisposable (FileStream en hérite). La classe de flux de base implémente Dispose() explicitement, vous ne verrez donc Dispose() que si vous avez casté le flux comme IDisposeable (ce qui est le cas avec {}).

Stream.Dispose() appelle Stream.Close().

(obtenu tout cela via réflecteur)

+0

Merci, JMarsch. Tout cela a du sens. Avez-vous dû faire quelque chose de spécial pour le voir dans Reflector? Je ne pouvais pas le voir dans Stream non plus (je revérifierai demain) – philsquared

+1

J'ai eu du mal à le trouver aussi - j'étais assez confus au début! L'astuce est qu'elle est implémentée explicitement, et je suppose que cela signifie qu'elle ne fonctionne pas comme prévu. Dans Stream, recherchez "System.IDisposable.Dispose()" Il est trié avec les "s", et en plus, il est grisé, mais il est là. Cordialement – JMarsch