分配大型阵列;内存不足异常 VS 溢出异常

本文关键字:异常 VS 溢出 内存不足 大型 阵列 分配 | 更新日期: 2023-09-27 18:36:37

请考虑以下事项:

long size = int.MaxValue;
long[] huge = new long[size];     // throws OutOfMemoryException
long[] huge = new long[size + 1]; // throws OverflowException

我知道单个对象的大小有 2GB 的限制,这解释了第一个异常,但是为什么一旦元素数量超过 32 位,我就会得到不同的异常?

(如果这很重要,我使用的是 64 位计算机)。

编辑:我还可以定义和使用一个接受long的索引器,没有问题:

internal sealed class MyClass
{
   public object this[long x]
   { 
      get
      {
         Console.WriteLine("{0}", x);
         return null;
      }
   }
}
...
long size = int.MaxValue;
MyClass asdf = new MyClass();
object o = asdf[size * 50]; // outputs 107374182350

分配大型阵列;内存不足异常 VS 溢出异常

C# 数组按 System.Int32 编制索引。由于size + 1超出了Int32.MaxValue,因此会得到整数溢出。

如果您确实想使用long作为索引,请使用需要很长时间的Array.CreateInstance重载。

因此,从我收集到的信息来看,这里正在发生类似以下的事情:

  • 索引器通常可以使用任何类型的参数。
  • 内置的数组索引器可以接受任何整数类型...
  • 但是内置数组索引器的基础实现需要一个<= Int32.MaxValue的值,并且对于超过 Int32.MaxValue 的值,将引发溢出异常。

虽然后一点感觉像是某种奇怪的矛盾(接受大于 Int32 的类型,但如果您碰巧实际使用了这些额外的位中的任何一个,则会抛出异常),但这显然是以下事实的副作用:其中一些是半实现的,用于将来的数组实现,数组将被允许具有 Int32.MaxValue 个以上的元素。