【问题标题】:Why does MemoryStream not offer a constructor taking a "long" capacity?为什么 MemoryStream 不提供具有“长”容量的构造函数?
【发布时间】:2015-09-15 13:34:19
【问题描述】:

根据.NET MemoryStream - Should I set the capacity?,如果事先知道,最好设置MemoryStream的初始容量。

在我的代码中,我收到(来自第三方库)Stream 对象。这个Stream 被一个GetObjectResponse 类包裹着。

由于该类将在事务关闭后被释放,因此我需要复制接收到的流,以便之后继续使用。

Stream 类公开了一个Length 属性来确定流的长度,因此作为开始我开始编写的复制过程的第一步:

Stream destination = new MemoryStream(response.ResponseStream.Length);

但是编译器抛出一个错误,指出MemoryStream 没有采用long 参数,而是采用int

他们为什么要这样做?

如果MemoryStream 扩展自Stream,这意味着它可以有一个很长的Length。如果它可以有long 的大小,为什么不能采用long 的初始容量?

我试图避免初始化没有容量的流,因为我想利用我知道流将有多大的事实,但构造函数似乎限制了这个愿望。

我该如何解决这个问题,为什么MemoryStream 不能使用long 容量?

【问题讨论】:

    标签: c# .net memory io stream


    【解决方案1】:

    MemoryStream 目前不支持超过 2GB 的数据。这是当前的限制。原则上不必存在。

    这只是一个(还)没有实现的功能的例子。

    在当前的 CLR 上实现更大的流是困难的,它只支持最多包含 int.MaxValue 元素的数组。

    【讨论】:

    • 它原则上必须存在。您不能索引其 GetBuffer() 和 ToArray() 成员返回的数组,否则,数组索引必须小于 int.MaxValue。
    • 啊,原来如此。限制被锁定在 API 表面。不过,也许未来的 CLR 会修复数组长度限制。
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多