2014-11-24 23 views
5

Hôm nay tôi nhận thấy có điều gì đó kỳ lạ với lớp MemoryStream. Thuộc tính .Lengthlong, nhưng thuộc tính .Capacity, có lẽ luôn là >= .Length chỉ là int.Kiểu dữ liệu cho MemoryStream.Capacity vs MemoryStream.Length

Tôi biết rằng sẽ mất một luồng trên GB để cho Độ dài vượt quá khả năng có thể, nhưng điều này có vẻ rất lạ đối với tôi. Không thể thay đổi Length vì nó được kế thừa từ Stream, nhưng tại sao không thực hiện Capacity a long? Điều gì sẽ xảy ra với công suất nếu bạn do có số MemoryStream vượt quá chiều dài int.MaxValue?

Trả lời

7

Không, MemoryStream.Capacity không được vượt quá int.MaxValue vì luồng bộ nhớ được hỗ trợ bởi byte[]arrays maximum length is int.MaxValue.

Tuy nhiên, Stream.Lengthlong, điều đó hợp lý vì luồng có thể là bất kỳ thứ gì, Ví dụ: FileStream.Length có thể lớn hơn int.MaxValue chắc chắn.

3

Một giới hạn cơ bản trong .NET, thật không may, là các đối tượng không được vượt quá 2GB. Lớp Stream cần có long cho thuộc tính Length của nó, bởi vì Stream có thể đại diện cho tài nguyên bên ngoài .NET (ví dụ: tệp), nhưng vì MemoryStream được biết đến luôn là đối tượng được quản lý trong bộ nhớ, nó luôn được đảm bảo có thể vừa với Capacity trong một số int.

+0

FWIW, .NET Framework 4.5 cho phép tạo mảng lớn hơn 2GB trên nền tảng 64 bit bằng cách đặt ['gcAllowVeryLargeObjects'] (http://msdn.microsoft.com/en-us/library/hh285054 (v = vs.110)) .aspx) bên trong 'app.config'. –

+0

@YuvalItzchakov Vẫn có giới hạn về số lượng _indexes_ đối với mảng lớn, nhỏ hơn 2^31 (chi tiết trong liên kết của bạn). '' MemoryStream'' sẽ vẫn chỉ có thể giữ một chút ít hơn 2GB với chuyển đổi đó được kích hoạt. – danwyand

2

Thuộc tính Length được kế thừa từ Stream, trong khi thuộc tính Capacity được khai báo cho MemoryStream. Các luồng nói chung có thể lớn hơn 2GB, nhưng loại luồng cụ thể này sẽ không bao giờ - do đó, Capacity cụ thể cho MemoryStream chỉ là một int.

Các vấn đề liên quan