2009-06-24 5 views
8

Obecnie piszę trochę zabawka asemblera w C# (przechodzi the elements of computing systems book. Naprawdę dobrą książkę przy okazji).NET strumienie, przechodząc strumieni między obiektami, najlepsze praktyki (C#)

Assembler zajmuje wejście ścieżka pliku i usuwa linie śmieci (komentarze itp.).

Plik jest następnie przekazywany do analizatora składni, a następnie do innego modułu, który tworzy kod binarny.

Nie jest to zbyt skomplikowane, ale nie chciałbym zapisywać pliku tymczasowego do systemu plików za każdym razem, gdy jeden obiekt zakończy przetwarzanie pliku wejściowego.

Chciałbym po prostu przekazać strumień do następnego obiektu. Początkowo sądziłem, że każda klasa zaangażowana w usuwanie parsowania/usuwania śmieci zaimplementuje IDisposable, ale myślę, że oznacza to, że nie mogę przekazać strumienia do następnego obiektu do przetworzenia (strumień byłby zamknięty, chyba że trzymam go w jednym za pomocą instrukcji ?).

Chyba brakuje mi tutaj, czy istnieje prosty sposób przesyłania strumieni między obiektami w sposób czysty, czy też potrzebuję innego podejścia?

Z góry dziękuję za pomoc!

+1

Ten kurs brzmi wspaniale. –

+2

Niestety nie biorę udziału w kursie! Po prostu przeglądam książkę na własną rękę - jest naprawdę dobra! Polecam książkę każdemu koderowi, który chce wiedzieć, co się dzieje "pod". – bplus

+0

@Richard Hein: jak bplus, robię także samodzielne czytanie książki. To jest niesamowite i gorąco polecam go każdemu, kto ma choć trochę doświadczenia w programowaniu. – Dinah

Odpowiedz

8

Zasadniczo obowiązkiem konsumenta jest prawidłowe pozbywanie się obiektu jednorazowego użytku. W związku z tym, jeśli przekażesz Stream do innego obiektu, nie powinieneś go wyrzucać - to byłby obowiązek konsumenta.

Tak więc w scenariuszach jednoznacznych albo odwołujesz się do obiektu jednorazowego, w takim przypadku powinieneś upewnić się, że jest on prawidłowo usuwany; lub przekazujesz referencję do kogoś innego i zapominasz o tym.

A co z przypadkami, w których trzeba się odwołać, ale mimo to przekazać dalej? W takich przypadkach należy przekazać kopię zasobu jednorazowego użytku - pozwoli to użytkownikowi i użytkownikowi na zarządzanie czasem życia dwóch instancji niezależnie od siebie. Jeśli jednak wejdziesz w tę sytuację, powinieneś przemyśleć swój projekt, jak nazwałbym to zapachem kodu.

+0

Dzięki za to (i dzięki innym respondentom). Tak, co sugerujesz, jest o wiele czystsze niż to, co robiłem. – bplus

2

Jeśli coś innego używa strumienia po wykonaniu asemblera, asembler nie powinien "posiadać" strumienia. Program wywołujący powinien utworzyć strumień dla asemblera (i kolejnych modułów) do użycia lub asembler powinien zwrócić nowy strumień, który jest następnie odpowiedzialny za zamknięcie.

Pouczające byłoby zobaczyć więcej szczegółów na temat tego, jak wygląda architektura twojego programu i jakie metody tutaj omawiamy.

0

Ogólnie, zgadzam się z poprzednimi komentarzami. Jednak jeśli twój model nie pasuje do tego, możesz zrobić to, co Microsoft zrobił z Pisarzem XML: Przyjmuje parametr XMLWriterSettings podczas jego instancji, a jedna z właściwości obiektu ustawień opisuje, czy program piszący powinien zamykać bazowy strumień, gdy pisarz został usunięty.

0

Sposób zrobiłem te projekty w Tecs jest:

  • przeczytać każdy wiersz w pliku
  • przyciąć spacje na początku i na końcu linii
  • jeśli linia jest pusta lub jeśli zaczyna się od // następnie przejść do następnej linii
  • inaczej, przechowywać wiersz w tablicy (w C#, tak naprawdę użyć Lista < ciąg > Object)

Po przejściu wszystkich linii mogę zamknąć strumień plików i bezpiecznie wykonać pracę na tablicy linii.