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!
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.
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.
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.
Wie ich diese Projekte in TECS gemacht habe, ist:
Sobald ich alle Zeilen durchgegangen bin, kann ich meinen Dateistrom schließen und meine Arbeit an dem Zeilenarray erledigen.