.NET流,在对象之间传递流,最佳实践(C#)

时间:2009-06-24 22:05:48

标签: c# stream

我目前正在c#中编写一个小玩具汇编程序(通过the elements of computing systems book。顺便说一句,这本书非常好。)

汇编程序采用输入文件路径并删除垃圾(注释等)行。

然后将文件传递给解析器,最后传递给另一个创建二进制代码的模块。

这不是太复杂,但是每次一个对象完成对输入文件的处理时,我不想写文件系统的临时文件。

我想将流传递到下一个对象。 我原本以为每个涉及解析/垃圾删除的类都会实现IDisposable,但我认为这意味着我无法在下一个对象上传递流进行处理(流将被关闭,除非我将它全部保存在一个使用语句中? )。

我想我在这里遗漏了一些东西,是否有一种简单的方法可以干净地在对象之间传递流,或者我需要一种不同的方法吗?

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:9)

通常,消费者有责任妥善处理Disposable对象。因此,如果您将Stream传递给另一个对象,则不应该将其置于此处 - 这将是消费者的责任。

因此,在明确的场景中,您要么持有对Disposable对象的引用,在这种情况下,您应该确保它被正确处理;或者你将引用传递给别人并忘掉它。

那么你需要自己持有一个引用,但仍然传递它的情况呢?在这些情况下,传递Disposable资源的副本 - 这将使您和使用者能够彼此独立地管理两个实例的生命周期。但是,如果你遇到这种情况,你应该重新考虑你的设计,因为我称之为代码味道。

答案 1 :(得分:2)

如果在汇编程序完成之后其他东西正在使用该流,则汇编程序不应该“拥有”该流。调用者应该为汇编程序(和后续模块)创建一个流来使用,或者汇编器应该返回一个新的流,然后调用者有责任关闭它。

看一些关于程序体系结构的详细信息以及我们在这里讨论的方法,这将是有益的。

答案 2 :(得分:0)

总的来说,我同意之前的评论。但是,如果您的模型不适合,您可以执行Microsoft对XML Writer所做的操作:它在您实例化时接受XMLWriterSettings参数,并且设置对象的一个​​属性描述编写器是否应在关闭基础流时作家被处置了。

答案 3 :(得分:0)

我在TECS中完成这些项目的方式是:

  • 读取文件中的每一行
  • 修剪行开头和结尾处的空白
  • 如果该行为空或者以//开头,则转到下一行
  • 否则,将行存储在数组中(在C#中,我实际上使用List< string>对象)

一旦我浏览了所有行,我就可以关闭文件流并安全地在行数组上完成工作。