Массив теоретически может содержать не более 2 147 483 647 элементов, поскольку он использует int для индексации. Фактический предел немного ниже, в зависимости от типа, содержащегося в массиве.
Однако в .NET CLR существует ограничение в 2 ГБ для одного объекта, даже в 64-битной версии. Это было сделано по проекту .
Вы можете легко создать реализацию IList<T>
, которая внутренне поддерживает несколько массивов и позволяет вырасти за пределы 2 ГБ для одного объекта, но в самой структуре нет ни одного.
Как правило, однако, это не настоящая проблема. В большинстве случаев у вас будут массивы, указывающие на большие классы, поэтому массив просто содержит ссылки. Это означает, что ваш массив может эффективно указывать на множество ГБ памяти, но сам массив не может быть> 2 ГБ.
Обратите внимание, что начиная с версии .NET 4.5 появилась новая опция, позволяющая подписаться на 64-битные приложения: gcAllowVeryLargeObjects . С помощью этого нового набора параметров можно получить UInt32.MaxValue
(4 294 967 295) элементов в многомерном массиве, хотя одномерный массив все еще ограничен 2 146 435 071 элементом (2 147 483 591 для однобайтовых массивов или массивов структур, не содержащих ничего байт).
Новые правила с этой опцией:
- Максимальное количество элементов в массиве - UInt32.MaxValue.
- Максимальный индекс в любом одном измерении составляет 2 147 483 591 (0x7FFFFFC7) для байтовых массивов и массивов однобайтовых структур и 2 146 435 071 (0X7FEFFFFF) для других типов.
- Максимальный размер строк и других объектов, не являющихся массивами, не изменяется.