【问题标题】:.NET streams, passing streams between objects, best practices (C#).NET 流、在对象之间传递流、最佳实践 (C#)
【发布时间】:2009-06-24 22:05:47
【问题描述】:

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

汇编器采用输入文件路径并删除垃圾(cmets 等)行。

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

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

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

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

提前感谢您的帮助!

【问题讨论】:

  • 很遗憾,我没有参加这门课程!自己一个人看书——真的很棒!我会将这本书推荐给任何想知道“下面”发生了什么的程序员。
  • @Richard Hein:和 bplus 一样,我也在自定进度阅读这本书。这太棒了,我强烈推荐给至少有一些编程经验的人。
  • 不,你好,也不谢谢。是否应该从帖子中删除“嗨”、“谢谢”以及标语和称呼? meta.stackexchange.com/questions/2950/…

标签: c# stream


【解决方案1】:

一般来说,正确处置 Disposable 对象是消费者的责任。因此,如果您将 Stream 传递给另一个对象,则不应 Dispose 它 - 那将是使用者的责任。

所以在明确的场景中,要么你持有一个 Disposable 对象的引用,在这种情况下你应该确保它被正确地释放;或者您将引用传递给其他人并忘记它。

那么,您需要自己保存引用但仍将其传递的情况如何?在这些情况下,传递 Disposable 资源的副本 - 这将允许您和使用者独立地管理两个实例的生命周期。但是,如果您遇到这种情况,您应该重新考虑您的设计,因为我称之为代码异味。

【讨论】:

  • 感谢(感谢其他响应者)。是的,你的建议比我做的要干净得多。
【解决方案2】:

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

了解更多有关您的程序架构的详细信息以及我们在此讨论的方法会很有启发性。

【讨论】:

    【解决方案3】:

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

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

    完成所有行后,我可以关闭文件流并安全地处理行数组。

    【讨论】:

      【解决方案4】:

      总的来说,我同意之前的 cmets。但是,如果您的模型不适合,您可以像 Microsoft 对 XML Writer 所做的那样:它在您实例化它时接受 XMLWriterSettings 参数,并且设置对象的属性之一描述了写入器是否应该关闭底层流作家被处置了。

      【讨论】:

        猜你喜欢
        • 2019-11-20
        • 2016-03-22
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多