.NET-Streams, Streams zwischen Objekten übergeben, Best Practices (C #)

8

Ich schreibe gerade einen kleinen Spielzeug-Assembler in c # (geht durch die Elemente der Computer-Systeme Buch ). Wirklich gutes Buch übrigens.)

Der Assembler nimmt einen Eingabedateipfad und entfernt überflüssige (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 den Stream einfach auf das nächste Objekt übertragen. Ich dachte ursprünglich, dass jede Klasse, die am Parsing / Junk-Remove beteiligt ist, IDisposable implementiert, aber ich denke, das bedeutet, dass ich den Stream beim nächsten Objekt zur Verarbeitung nicht übergeben kann (der Stream wäre geschlossen, es sei denn, ich verwende alles in einer Anweisung). ).

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

Vielen Dank im Voraus für jede Hilfe!

    
bplus 24.06.2009, 22:05
quelle

4 Antworten

9

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 - das wäre die Verantwortung des Konsumenten.

In den klar umrissenen Szenarien haben Sie also entweder einen Verweis auf ein Einwegobjekt, und in diesem Fall sollten Sie sicherstellen, dass es ordnungsgemäß entsorgt wird. oder du gibst den Hinweis 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.

    
Mark Seemann 24.06.2009, 22:28
quelle
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, den der Aufrufer dann schließen muss.

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

    
David 24.06.2009 22:21
quelle
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 entsorgt.

    
JMarsch 24.06.2009 23:04
quelle
0

Wie ich diese Projekte in TECS gemacht habe, ist:

  • lies jede Zeile in der Datei
  • trimmen Sie das Leerzeichen am Anfang und Ende der Zeile
  • Wenn die Zeile leer ist oder mit // beginnt, gehen Sie zur nächsten Zeile
  • Speichern Sie andernfalls die Zeile in einem Array (in C # verwende ich eigentlich ein List & lt; string & gt; -Objekt)

Sobald ich alle Zeilen durchgegangen bin, kann ich meinen Dateistrom schließen und meine Arbeit an dem Zeilenarray erledigen.

    
Dinah 03.09.2009 18:27
quelle

Tags und Links