假设我们有一个长度非常大的字符串,甚至比 max_int 还要大。
string str="this should contain a long string";
如果我想到达str[100000000000]
.
我该怎么做?
当我尝试放置其类型不是 int 的索引时,我收到以下错误:
'string.this[int]' 的最佳重载方法匹配有一些无效参数
你不能。我不相信你可以拥有一个占用超过 2^32 字节的对象,所以你真的不会遇到这个。
根据这篇文章,最大 CLR 对象大小为 2GB,这证实了我的说法。
在 .NET 4.5 之前,单个对象的最大大小为 2GB,因此您永远不可能拥有这么大的字符串,因此尝试使用这么大的索引没有任何意义。
在 .NET 4.5 中,您可以增加该限制。引用MSDN:
“默认情况下,当您在 64 位 Windows 操作系统上运行 64 位托管应用程序时,您可以创建不超过 2 GB 的对象。但是,在 .NET Framework 4.5 中,您可以增加这个限制。有关更多信息,请参阅gcAllowVeryLargeObjects元素。”
但是,大多数容器仍然具有基于数组的接口int
,甚至对于数组,这也无济于事......
“数组中元素的最大数量是UInt32MaxValue。”
...这是 4,294,967,295,仍然小于您建议的 100,000,000,000。
你真的需要有那么多连续的记忆吗?为什么不将数据拆分为更小的块?
您需要实现支持大范围索引的自定义数组。
所有普通的 .Net 类型(如字符串、数组、列表)仅支持用于索引的整数。这部分是由于对最大连续分配大小的限制 - 因此您的自定义类需要分块数据以支持此类索引。
您可以使用Array.GetValue来获取大于的数组索引int
。