MemoryStream.Capacity vs MemoryStream.Length的数据类型

本文关键字:MemoryStream 数据类型 vs Capacity Length | 更新日期: 2023-09-27 18:31:43

今天我注意到MemoryStream类有些奇怪。.Length属性是一个long,但是.Capacity属性,大概应该总是>= .Length只是一个int

我知道长度需要超过一GB的流才能超过可能的容量,但这对我来说似乎很奇怪。 Length无法改变,因为它是从Stream继承而来的,但为什么不让Capacity也成为long呢? 如果您的MemoryStream长度超过 int.MaxValue,容量会怎样?

MemoryStream.Capacity vs MemoryStream.Length的数据类型

不,MemoryStream.Capacity不能超过int.MaxValue,因为内存流由byte[]支持,数组最大长度为 int.MaxValue

但是,Stream.Lengthlong,这是有道理的,因为流可以是任何东西,例如FileStream.Length无疑可以大于int.MaxValue

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

Length 属性继承自 Stream ,而 Capacity 属性声明为 MemoryStream 。一般流可能大于 2GB,但这种特殊类型的流永远不会 - 因此,特定于MemoryStreamCapacity只是一个int