【问题标题】:How to determine if MemoryStream is fixed size?如何确定 MemoryStream 是否为固定大小?
【发布时间】:2013-06-19 14:56:07
【问题描述】:

我的方法获取 MemoryStream 作为参数。如何知道这个 MemoryStream 是否可扩展?

MemoryStream 可以通过使用“new MemoryStream(byte[] buf)”的数组来创建。这意味着流将具有固定大小。您不能将数据附加到它。 另一方面,可以使用“new MemoryStream()”创建不带参数的流。在这种情况下,您可以将数据附加到它。

问题:我怎么知道 - 我可以安全地将数据附加到当前流中,还是必须创建一个新的可扩展流并将数据复制到其中?

【问题讨论】:

  • 您尝试过 CanWrite 属性吗?它会区分这些情况吗?
  • 如果没有更多上下文,我会说你不应该尝试。如果调用者传递了一个不能接受数据的 Stream,他们不应该调用会导致数据被写入的操作。也就是说,也许你可以改进类的界面,这样它就不是问题了。
  • 它总是可以接受数据。您可以将任何内容写入流,但可用缓冲区已修复。您既不能在缓冲区之外写入,也不能扩展其容量

标签: c# memorystream expandable


【解决方案1】:

您可以使用反射来做到这一点:

static bool IsExpandable(MemoryStream stream)
{
    return (bool)typeof(MemoryStream)
        .GetField("_expandable", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
        .GetValue(stream);
}

我不知道是否有更清洁/更安全的方式来检索此信息。

【讨论】:

  • 不错的解决方案 :) 但是使用反射来完成如此简单的任务......认为我只是走错路了,不需要这个问题的任何解决方案;)我应该保持简单,愚蠢.
【解决方案2】:

从某种意义上说,它实际上并不是一个固定大小,最好将其定义为“不可扩展”,因为它仍然可以通过 SetLength 截断,但无论如何……您能做的最好的事情可能就是始终使用可扩展的流,或者如果您不控制代码的这方面...也许尝试抓住您扩展流的尝试,如果失败,将其复制到可写流并再次递归调用该方法?

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多