2009-06-24 2 views
8

Attualmente sto scrivendo un po 'assemblatore giocattolo in C# (passando the elements of computing systems book. Davvero un buon libro a proposito.).NET ruscelli, passando i flussi tra gli oggetti, le migliori pratiche (C#)

L'assemblatore richiede un input percorso del file e rimuove le linee di posta indesiderata (commenti, ecc.).

Il file viene quindi passato a un parser e infine a un altro modulo che crea il codice binario.

Questo non è troppo complicato, ma mi piacerebbe non dover scrivere un file temporaneo sul filesystem ogni volta che un oggetto ha terminato l'elaborazione del file di input.

Mi piacerebbe solo passare il flusso sul prossimo oggetto. Inizialmente pensavo che ogni classe coinvolta nella parsing/junk removal avrebbe implementato IDisposable ma penso che questo significhi che non posso passare lo stream sul prossimo oggetto per l'elaborazione (lo stream sarebbe chiuso, a meno che non tenga tutto in uno usando l'istruzione ?).

Penso che mi manchi qualcosa, c'è un modo semplice per passare i flussi tra gli oggetti in modo pulito o ho bisogno di un approccio diverso?

Grazie in anticipo per qualsiasi aiuto!

+1

Questo corso sembra fantastico. –

+2

Purtroppo non seguo il corso! Basta leggere il libro da solo - è davvero buono! Consiglierei il libro a qualsiasi programmatore che voglia sapere cosa sta succedendo "sotto". – bplus

+0

@Richard Hein: come bplus, sto anche facendo una lettura personale del libro. È incredibile e lo consiglio vivamente a chiunque abbia almeno un'esperienza di programmazione. – Dinah

risposta

8

In generale, è responsabilità del consumatore smaltire correttamente un oggetto monouso. Pertanto, se si trasferisce un flusso su un altro oggetto, non si dovrebbe Smaltirlo, questa sarebbe la responsabilità del consumatore.

Quindi, negli scenari chiari, si detiene un riferimento a un oggetto a gettare, nel qual caso è necessario assicurarsi che sia correttamente smaltito; o si passa il riferimento a qualcun altro e non pensarci più.

Quindi, per quanto riguarda i casi in cui è necessario tenere un riferimento da soli, ma ancora passarlo lungo? In questi casi, passa una copia della risorsa usa e getta: questo consentirà a te e al consumatore di gestire la durata delle due istanze indipendentemente l'una dall'altra. Tuttavia, se ti trovi in ​​questa situazione, dovresti riconsiderare il tuo design, come direi un odore di codice.

+0

Grazie per questo (e grazie agli altri risponditori). Sì, quello che suggerisci è molto più pulito di quello che stavo facendo. – bplus

2

Se qualcos'altro utilizza lo stream dopo che l'assemblatore ha terminato, l'assemblatore non dovrebbe "possedere" il flusso. Il chiamante deve creare uno stream per l'assemblatore (e i moduli successivi) da utilizzare, oppure l'assemblatore deve restituire un nuovo flusso che è quindi responsabilità del chiamante chiudere.

Sarebbe istruttivo vedere ulteriori dettagli su come si presenta l'architettura del tuo programma e su quali metodi stiamo discutendo qui.

0

Nel complesso, sono d'accordo con i commenti precedenti. Tuttavia, se il tuo modello non si adatta a questo, potresti fare ciò che Microsoft ha fatto con XML Writer: accetta un parametro XMLWriterSettings quando lo installi, e una delle proprietà dell'oggetto settings descrive se il writer deve chiudere il flusso sottostante quando lo scrittore è disposto.

0

Il modo in cui ho fatto questi progetti in TECS è:

  • leggere ogni riga nel file
  • tagliare gli spazi bianchi all'inizio e alla fine della linea
  • se la linea è vuota o se si inizia con // poi passare alla riga successiva
  • in caso contrario, la linea in un array (in C#, io in realtà uso un elenco <stringa> oggetto)

Dopo aver esaminato tutte le righe, posso chiudere il flusso di file e lavorare in modo sicuro alla serie di linee.