2009-06-24 8 views
8

Actualmente estoy escribiendo un poco de ensamblador de juguete en C# (pasando por the elements of computing systems book. Libro muy bueno por cierto.).NET corrientes, pasando corrientes entre los objetos, las mejores prácticas (C#)

El ensamblador toma una entrada ruta del archivo y elimina las líneas basura (comentarios, etc.).

El archivo se pasa a un analizador y finalmente a otro módulo que crea el código binario.

Esto no es demasiado complicado, pero me gustaría no tener que escribir un archivo temporal en el sistema de archivos cada vez que un objeto ha terminado su procesamiento del archivo de entrada.

Me gustaría pasar la corriente al siguiente objeto. Originalmente pensé que cada clase involucrada en el análisis sintáctico/eliminación de basura implementaría IDisposable, pero creo que esto significa que no puedo pasar la secuencia en el siguiente objeto para procesar (la transmisión se cerraría, a menos que lo guarde todo en uno usando la instrucción ?).

Creo que me falta algo aquí, ¿hay una manera simple de pasar las secuencias entre los objetos limpiamente, o necesito un enfoque diferente?

¡Gracias de antemano por cualquier ayuda!

+1

Ese curso suena increíble. –

+2

¡No estoy tomando el curso por desgracia! Yendo solo por el libro, ¡es realmente bueno! Recomendaría el libro a cualquier programador que quiera saber qué está sucediendo "debajo". – bplus

+0

@Richard Hein: como bplus, también estoy haciendo una lectura del libro a su propio ritmo. Es increíble y lo recomiendo encarecidamente a cualquiera que tenga al menos alguna experiencia en programación. – Dinah

Respuesta

8

En general, es responsabilidad del consumidor desechar correctamente un objeto desechable. Como tal, si transfiere un Stream a otro objeto, no debe desecharlo, eso sería responsabilidad del consumidor.

Por lo tanto, en los escenarios claros, o bien tiene una referencia a un objeto desechable, en cuyo caso debe asegurarse de que esté dispuesto correctamente; o pasas la referencia a otra persona y te olvidas de ella.

Entonces, ¿qué pasa con los casos en los que necesita mantener una referencia, pero aún así pasarla? En estos casos, pase una copia del recurso desechable: esto le permitirá a usted y al consumidor administrar la vida de las dos instancias independientemente una de la otra. Sin embargo, si te metes en esta situación, deberías reconsiderar tu diseño, como llamaría a ese código olor.

+0

Gracias por eso (y gracias a los otros respondedores). Sí, lo que sugieres es mucho más limpio que lo que estaba haciendo. – bplus

2

Si algo más está utilizando la secuencia después de que el ensamblador haya terminado con ella, el ensamblador no debe "ser dueño" de la secuencia. La persona que llama debe crear una secuencia para que el ensamblador (y los módulos posteriores) la utilicen, o el ensamblador debe devolver una nueva secuencia que luego es responsabilidad del usuario cerrar.

Sería instructivo ver más detalles sobre cómo se ve la arquitectura de su programa y qué métodos estamos discutiendo aquí.

0

En general, estoy de acuerdo con los comentarios anteriores. Sin embargo, si su modelo no se ajusta a eso, puede hacer lo que Microsoft hizo con XML Writer: acepta un parámetro XMLWriterSettings cuando lo instancia, y una de las propiedades del objeto de configuración describe si el escritor debe cerrar la secuencia subyacente cuando el escritor está dispuesto

0

La forma en que lo hice estos proyectos en TECS es:

  • leer cada línea en el archivo
  • recortar el espacio en blanco al principio y al final de la línea
  • si la línea está en blanco o si comienza con // y luego ir a la siguiente línea
  • También se puede conservar la línea en una matriz (en C#, en realidad utiliza una lista <cadena> objeto)

Una vez que he revisado todas las líneas, puedo cerrar mi secuencia de archivos y hacer mi trabajo de forma segura en la matriz de líneas.

Cuestiones relacionadas