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

我现在正在用c#编写一个小玩具汇编程序(通过计算系统书的元素 。顺便说一句,这本书非常好。)

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

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

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

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

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

在此先感谢您的帮助!

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

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

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

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

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

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

我在TECS做这些项目的方式是:

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

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