我正在尝试创建长度为byte
的{{1}}数组。这个数组本质上是一个小的(ish)内存数据库:
UInt32.MaxValue
然而,在我的机器上,在运行时,我得到byte[] countryCodes = new byte[UInt32.MaxValue];
“算术运算导致溢出”。
这笔交易是什么?我是否需要使用System.OverflowException
块和unsafe
?我怎么能在C#中做到这一点?
答案 0 :(得分:28)
System.Array
的当前实现对其所有内部计数器等使用Int32
,因此理论上最大元素数为Int32.MaxValue
。
Microsoft CLR还强加了2GB的每个对象最大大小限制。
这里有一个很好的讨论和解决方法......
这里有一些相关的,不完全重复的问题和答案......
答案 1 :(得分:8)
On .NET 4.5字节数组的最大可实例化长度为:2147483591,或者比int.MaxValue少56。通过以下方式找到:
for (int i = int.MaxValue; i > 0; i--)
{
try
{
byte[] b = new byte[i];
Console.Out.WriteLine("MaxValue: " + i);
Environment.Exit(0);
}
catch (Exception ignored)
{}
}
答案 2 :(得分:1)
我首先不会这样做。为什么要为内存数据库设置所有内存?您是否更愿意想要一个随着时间的推移而增加大小的数据结构(例如List<int>
)?或者(如果愿意)使用内容数据库,如sqlite?
答案 3 :(得分:1)
字节数组的最大长度为:2130702268。 例如:
var countryCodes = new byte[2130702268];