2009-06-24 14 views
8

ich zur Zeit einen kleinen Spielzeug-Assembler in C# zu schreiben (gehen durch the elements of computing systems book. Ein wirklich gutes Buch übrigens.).NET-Streams, Ströme zwischen Objekten, Best Practices (C#)

Der Assembler nimmt vorbei einen Eingang Dateipfad und entfernt Junk (Kommentare usw.) Zeilen.

Die Datei wird dann an einen Parser übergeben und schließlich an ein anderes Modul, das den Binärcode erstellt.

Das ist nicht zu kompliziert, aber ich möchte nicht jedes Mal eine temporäre Datei in das Dateisystem schreiben müssen, wenn ein Objekt die Verarbeitung der Eingabedatei beendet hat.

Ich möchte nur den Stream auf das nächste Objekt übergeben. Ursprünglich dachte ich, jede an der Analyse/Junk-Entfernung beteiligte Klasse würde IDisposable implementieren, aber ich denke, das bedeutet, dass ich den Stream für das nächste Objekt zur Verarbeitung nicht übergeben kann (der Stream wäre geschlossen, es sei denn, ich verwende alles mit Anweisung ?).

Ich denke, ich vermisse etwas hier, gibt es eine einfache Möglichkeit, Ströme zwischen Objekten sauber zu übergeben, oder brauche ich einen anderen Ansatz?

Vielen Dank im Voraus für jede Hilfe!

+1

Dieser Kurs klingt fantastisch. –

+2

Ich nehme den Kurs leider nicht! Ich gehe alleine durch das Buch - es ist wirklich gut! Ich würde das Buch jedem Coder empfehlen, der wissen will, was "drunter" los ist. – bplus

+0

@Richard Hein: Wie bplus mache ich auch ein selbstgesteuertes Lesen des Buches. Es ist unglaublich und ich empfehle es jedem, der zumindest etwas Programmiererfahrung hat. – Dinah

Antwort

8

Im Allgemeinen liegt es in der Verantwortung des Verbrauchers, ein Einwegprodukt ordnungsgemäß zu entsorgen. Wenn Sie also einen Stream an ein anderes Objekt übergeben, sollten Sie ihn nicht entsorgen - dies liegt in der Verantwortung des Verbrauchers.

Also in den klaren Szenarien, entweder Sie einen Verweis auf ein Einweg-Objekt, in diesem Fall sollten Sie sicherstellen, dass es ordnungsgemäß entsorgt wird; oder du gibst die Referenz an jemand anderen weiter und vergisst es.

Was ist dann mit den Fällen, in denen Sie selbst eine Referenz halten müssen, diese aber trotzdem weitergeben? Übergeben Sie in diesen Fällen eine Kopie der Einwegressource, damit Sie und der Verbraucher die Lebensdauer der beiden Instanzen unabhängig voneinander verwalten können. Wenn Sie jedoch in diese Situation geraten, sollten Sie Ihr Design überdenken, da ich das als Code-Geruch bezeichnen würde.

+0

Danke dafür (und danke an die anderen Responder). Ja, was Sie vorschlagen, ist viel sauberer als was ich tat. – bplus

2

Wenn etwas anderes den Stream verwendet, nachdem der Assembler damit fertig ist, sollte der Assembler den Stream nicht "besitzen". Der Aufrufer sollte entweder einen Stream für den Assembler (und die nachfolgenden Module) erstellen, oder der Assembler sollte einen neuen Stream zurückgeben, für den der Aufrufer verantwortlich ist.

Es wäre lehrreich, einige Details zu sehen, wie die Architektur Ihres Programms aussieht und welche Methoden wir hier diskutieren.

0

Insgesamt stimme ich den vorherigen Kommentaren zu. Wenn Ihr Modell jedoch nicht dazu passt, könnten Sie tun, was Microsoft mit dem XML-Writer getan hat: Es akzeptiert einen XMLWriterSettings-Parameter, wenn Sie ihn instanziieren, und eine der Eigenschaften des Einstellungsobjekts beschreibt, ob der Writer den zugrunde liegenden Stream schließen soll der Schreiber ist disponiert.

0

So wie ich diese Projekte in TECS tat ist:

  • jede Zeile in der
  • schneiden Sie die Leerzeichen am Anfang und Ende der Zeile Datei lesen
  • , wenn die Zeile leer ist, oder wenn es beginnt mit // dann
  • sonst in der nächsten Zeile gehen, speichern sie die Zeile in einem Array (in C#, benutze ich eigentlich eine Liste <String> Objekt)

Sobald ich alle Zeilen durchlaufen habe, kann ich meinen Dateistream schließen und meine Arbeit an dem Zeilenarray erledigen.