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
不能超过int.MaxValue
,因为内存流由byte[]
支持,数组最大长度为 int.MaxValue
。
但是,Stream.Length
是long
,这是有道理的,因为流可以是任何东西,例如FileStream.Length
无疑可以大于int.MaxValue
。
不幸的是,.NET 中的一个基本限制是对象的大小不能超过 2GB。Stream
类需要其 Length
属性的long
,因为Stream
可以表示 .NET 外部的资源(例如文件),但由于已知MemoryStream
始终是内存中的托管对象,因此可以保证始终能够将其Capacity
放入int
中。
Length
属性继承自 Stream
,而 Capacity
属性声明为 MemoryStream
。一般流可能大于 2GB,但这种特殊类型的流永远不会 - 因此,特定于MemoryStream
的Capacity
只是一个int
。