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

10

我目前正在使用C#编写一个玩具汇编器(通过计算系统的要素书)。顺便说一下,这是一本非常好的书。

汇编器接受输入文件路径并删除垃圾行(注释等)。

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

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

我想直接将流传递给下一个对象。 最初,我认为参与解析/删除垃圾的每个类都会实现IDisposable,但我认为这意味着我不能将流传递给下一个对象进行处理(流将被关闭,除非我将其全部保留在一个using语句中?)。

我认为我在这里漏掉了什么,是否有一种简单的方法可以在对象之间干净地传输流,还是我需要不同的方法?

谢谢您提前的任何帮助!


2
很遗憾我没有参加这门课程! 我只是自己翻阅这本书——它真的很好! 我会向任何想要了解“底层”知识的程序员推荐这本书。 - handles
@Richard Hein:像bplus一样,我也正在自学阅读这本书。它非常棒,我强烈推荐给任何有一定编程经验的人。 - Dinah
应该从帖子中删除“Hi”、“Thanks”、“taglines”和问候语吗?http://meta.stackexchange.com/questions/2950/should-hi-thanks-and-taglines-and-salutations-be-removed-from-posts - Kiquenet
4个回答

16

通常情况下,消费者有责任正确处置Disposable对象。因此,如果您将Stream传递给其他对象,则不应Dispose它——这应该由消费者负责。

因此,在明确的情况下,要么您持有对一个Disposable对象的引用,那么您应确保其被正确处理;要么您将引用传递给其他人并忘记它。

那么,在需要自己持有引用但仍然需要传递引用的情况下怎么办?在这些情况下,请传递Disposable资源的副本,这将允许您和消费者独立地管理两个实例的生命周期。但是,如果您遇到这种情况,请重新考虑设计,因为我认为这是一种代码异味。


谢谢你(也感谢其他回答者)。 是的,你建议的比我做的要干净得多。 - handles

2
如果汇编器完成后,还有其他东西在使用流,则汇编器不应“拥有”该流。调用者应该为汇编器(和后续模块)创建一个流来使用,或者汇编器应返回一个新的流,然后由调用者负责关闭。
看到您的程序架构以及我们正在讨论的方法的更多细节将是有益的。

1
我在TECS中完成这些项目的方式是:
  • 读取文件中的每一行
  • 去除行首和行尾的空白字符
  • 如果该行为空白或以//开头,则跳到下一行
  • 否则,将该行存储在一个数组中(在C#中,我实际上使用了一个List<string>对象)
一旦我遍历了所有的行,我就可以关闭文件流,并安全地对行数组进行处理。

0
总的来说,我同意之前的评论。但是如果你的模型不适用于此,你可以像微软在 XML Writer 中所做的那样:在实例化时接受一个 XMLWriterSettings 参数,并且设置对象的属性之一描述了当写入器被处理时是否应关闭底层流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接