2009-06-24 4 views
8

は(the elements of computing systems bookを通過。本当に良い本を経由して。).NETストリームは、オブジェクト間のストリームを渡し、ベストプラクティス(C#の)私は現在、C#で小さなおもちゃアセンブラを書いて

は、アセンブラは、入力を受け取りファイルのパスとジャンク(コメントなど)行を削除します。

ファイルはパーサーに渡され、最後にバイナリコードを作成する別のモジュールに渡されます。

これはあまり複雑ではありませんが、1つのオブジェクトが入力ファイルの処理を終了するたびに一時ファイルをファイルシステムに書き出す必要はありません。

ストリームを次のオブジェクトに渡すだけです。 私は元々、解析/迷惑削除に関わる各クラスがIDisposableを実装すると思っていましたが、これは処理のために次のオブジェクトにストリームを渡すことができないと思います(ストリームを閉じることはできません。 ?)。

私はここで何か不足していると思いますが、オブジェクト間にストリームを簡単に渡す方法があるのですか、別の方法が必要ですか?

ありがとうございました!

+1

このコースはすばらしい音です。 –

+2

私はコースを残念ながらやっていません! ちょうど私自身の本を通って - それは本当に良いです! 「下に」何が起こっているのかを知りたいコーダーにこの本をお勧めします。 – bplus

+0

@リチャード・ハイン:bplusのように、私は自分のペースで本を読んでいます。それは信じられないほどのもので、少なくともプログラミングの経験がある人なら誰でもお勧めします。 – Dinah

答えて

8

通常、Disposableオブジェクトを適切に処分するのは消費者の責任です。そのため、ストリームを別のオブジェクトに渡すと、そのオブジェクトを破棄しないでください。これは消費者の責任になります。

したがって、明確なシナリオでは、Disposableオブジェクトへの参照を保持するか、その場合、適切に配置されていることを確認する必要があります。またはあなたは他の人に参照を渡し、それについて忘れてしまいます。

次に、参照を自分で保持する必要がある場合はどうしますか?このような場合は、Disposableリソースのコピーを渡します。これにより、あなたと消費者は、2つのインスタンスのライフタイムを互いに独立して管理することができます。しかし、このような状況に陥った場合は、コードの匂いと呼ぶように、デザインを再考する必要があります。

+0

ありがとうございました(他のレスポンダーに感謝します)。 あなたの提案は、私がやっていたことよりもはるかにクリーンです。 – bplus

2

アセンブラでストリームを使用しているものが他にある場合、アセンブラはそのストリームを「所有する」べきではありません。呼び出し元は、アセンブラ(および後続のモジュール)が使用するストリームを作成するか、アセンブラが新しいストリームを返す必要があります。

プログラムのアーキテクチャがどのように見えるか、ここでどのような方法で議論しているかについて詳しく知ることは有益です。

0

全体として、前のコメントに同意します。ただし、モデルがそれに合わない場合は、MicrosoftがXML Writerで行ったことを実行できます。XMLWriterSettingsパラメータをインスタンス化するときにそれを受け取り、設定オブジェクトのプロパティの1つが、ライタが基になるストリームを閉じる必要があるかどうかを示しますライターが配置されます。

0

私はTECSにこれらのプロジェクトを行った方法は次のとおりです。

  • 行が空白または場合であればライン
  • の最初と最後に空白をトリムファイルに
  • をそれぞれの行を読んで//は、配列内の行を格納し、それ以外の場合は次の行
  • に行くと、それは
(C#で、私は実際にリスト<文字列>オブジェクトを使用)を開始します

すべての行を終えると、ファイルストリームを閉じて、行の配列に対して自分の作業を安全に行うことができます。

関連する問題