内存流的数据类型:MemoryStream.Capacity 与 MemoryStream.Length 的区别

7
今天我注意到MemoryStream类有点奇怪。.Length属性是long类型的,但是.Capacity属性应该始终大于或等于.Length,但它只是一个int
我知道需要超过1GB的流才能使长度超过可能的容量,但这对我来说似乎非常奇怪。因为Length是从Stream继承而来,所以无法更改,但为什么不将Capacity也变成long呢?如果您确实有一个长度超过int.MaxValueMemoryStream,那么容量会发生什么情况?
3个回答

9
不,由于内存流由一个byte[]支持,数组的最大长度为int.MaxValue,所以MemoryStream.Capacity不能超过int.MaxValue。
然而,Stream.Length是long类型的,这是有意义的,因为流可以是任何东西。例如,FileStream.Length毫无疑问可以大于int.MaxValue。

3

很不幸,.NET 的一个基本限制是对象的大小不能超过 2GB。Stream 类需要 long 来表示 Length 属性,因为 Stream 可以代表 .NET 之外的资源(例如文件),但由于 MemoryStream 被认为总是在内存中,被托管对象所知,因此保证始终可以将其 Capacity 安装在 int 中。


值得一提的是,.NET Framework 4.5允许在64位平台上通过在“app.config”中设置gcAllowVeryLargeObjects来创建大于2GB的数组。 - Yuval Itzchakov
@YuvalItzchakov 尽管如此,对于大数组的索引数量仍存在一些限制,这些限制比2 ^ 31略小(详见您提供的链接)。启用该开关后,“MemoryStream”仍将仅能容纳不到2GB。 - danwyand

2

Length属性是从Stream继承的,而Capacity属性是为MemoryStream声明的。一般来说,流可能比2GB更大,但这种特定类型的流永远不会超过2GB,因此MemoryStream特有的Capacity只是一个int


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