2009-06-24 7 views
8

J'écris actuellement un assembleur peu de jouets en C# (en passant par the elements of computing systems book. Vraiment un bon livre en passant.)flux .NET, les flux passant entre les objets, les meilleures pratiques (C#)

L'assembleur prend une entrée chemin du fichier et supprime les lignes indésirables (commentaires, etc.).

Le fichier est ensuite transmis à un analyseur puis finalement à un autre module qui crée le code binaire.

Ce n'est pas trop compliqué, mais je ne voudrais pas avoir à écrire un fichier temporaire dans le système de fichiers chaque fois qu'un objet a terminé le traitement du fichier d'entrée. Je voudrais juste passer le flux sur l'objet suivant. Je pensais que chaque classe impliquée dans le parsing/junk removal implémenterait IDisposable mais je pense que cela signifie que je ne peux pas passer le flux sur l'objet suivant pour le traitement (le flux serait fermé, sauf si je le garde ?).

Je pense qu'il me manque quelque chose ici, existe-t-il un moyen simple de passer proprement les flux entre les objets, ou ai-je besoin d'une approche différente?

Merci d'avance pour toute aide!

+1

Ce cours semble génial. –

+2

Je ne prends pas le cours malheureusement! Juste en passant par le livre de mon propre chef - c'est vraiment bon! Je recommanderais le livre à n'importe quel codeur qui veut savoir ce qui se passe "dessous". – bplus

+0

@Richard Hein: Comme bplus, je fais aussi une lecture du livre à mon rythme. C'est incroyable et je le recommande vivement à tous ceux qui ont au moins une expérience de programmation. – Dinah

Répondre

8

En général, il est de la responsabilité du consommateur de disposer correctement d'un objet jetable. En tant que tel, si vous transmettez un Stream à un autre objet, vous ne devriez pas le Disposer - ce serait la responsabilité du consommateur. Par conséquent, dans les scénarios de coupe à blanc, soit vous détenez une référence à un objet Jetable, auquel cas vous devez vous assurer qu'il est correctement éliminé; ou vous passez la référence à quelqu'un d'autre et l'oubliez.

Alors, qu'en est-il des cas où vous devez tenir vous-même une référence, tout en la transmettant? Dans ces cas, transmettez une copie de la ressource Jetable - cela vous permettra, ainsi qu'au consommateur, de gérer la durée de vie des deux instances indépendamment l'une de l'autre. Cependant, si vous vous trouvez dans cette situation, vous devriez reconsidérer votre conception, comme j'appellerais cela une odeur de code.

+0

Merci pour cela (et merci aux autres intervenants). Oui, ce que vous suggérez est beaucoup plus propre que ce que je faisais. – bplus

2

Si quelque chose d'autre utilise le flux après que l'assembleur a terminé, l'assembleur ne doit pas "posséder" le flux. L'appelant doit créer un flux pour l'assembleur (et les modules suivants) à utiliser, ou l'assembleur doit renvoyer un nouveau flux dont la fermeture incombe à l'appelant.

Il serait instructif de voir plus de détails sur l'apparence de l'architecture de votre programme et sur les méthodes dont nous discutons ici.

0

Dans l'ensemble, je suis d'accord avec les commentaires précédents. Toutefois, si votre modèle ne correspond pas, vous pouvez faire ce que Microsoft a fait avec XML Writer: Il accepte un paramètre XMLWriterSettings lorsque vous l'utilisez, et l'une des propriétés de l'objet settings décrit si le writer doit fermer le flux sous-jacent l'écrivain est disposé.

0

La façon dont je l'ai fait ces projets TECS:

  • lire chaque ligne dans le fichier
  • couper les espaces au début et à la fin de la ligne
  • si la ligne est vide ou si il commence par // puis passez à la ligne suivante
  • autrement, stocker la ligne dans un tableau (en C#, je l'utilise en fait une liste < chaîne objet >)

Une fois que j'ai parcouru toutes les lignes, je peux fermer mon flux de fichiers et faire mon travail en toute sécurité sur la série de lignes.

Questions connexes