今天我注意到MemoryStream
课程有些奇怪。 .Length
属性为long
,但.Capacity
属性(可能始终为>= .Length
)仅为int
。
我知道,如果长度超过可能的容量需要超过1 GB的流,但这对我来说似乎很奇怪。 Length
无法更改,因为它是从Stream
继承而来的,但为什么不将Capacity
改为long
?如果您 的MemoryStream
长度超过int.MaxValue
会对容量产生什么影响?
答案 0 :(得分:8)
不,MemoryStream.Capacity
不能超过int.MaxValue
,因为内存流由byte[]
和arrays maximum length is int.MaxValue
支持。
但是,Stream.Length
为long
,这是有道理的,因为流可以是任何内容,例如FileStream.Length
无疑可能大于int.MaxValue
。
答案 1 :(得分:3)
遗憾的是,.NET的一个基本限制是对象的大小不能超过2GB。 Stream
类的long
属性需要Length
,因为Stream
可以表示.NET之外的资源(例如文件),但是MemoryStream
已知它始终是一个内存中的托管对象,保证始终能够将Capacity
放在int
中。
答案 2 :(得分:2)
Length
属性继承自Stream
,而Capacity
属性则为MemoryStream
声明。流通常可能大于2GB,但这种特殊类型的流永远不会 - 因此,Capacity
特定的MemoryStream
只是int
。