为什么在C#中允许“long”作为数组长度?
我想尝试分配一个40亿字节的数组,这是我的C#代码:
long size = 4 * 1000; size *= 1000; size *= 1000; byte[] array = new byte[size];
此代码在包含new
的行上的System.OverflowException
失败。 好的,结果是Length
返回int
,所以数组长度也限制为int
可以存储的内容。
那么为什么没有编译时错误,并且允许long
作为分配时数组元素的数量?
因为规范在第7.6.10.4节中说明了这一点:
表达式列表中的每个表达式必须是
int
,uint
,long
或ulong
,或者可以隐式转换为这些类型中的一个或多个。
这很可能很容易创建大于2 GiB的数组,即使它们尚不支持(但一旦CLR做出这样的改变就没有语言改变)。 Mono确实支持这一点,但 .NET 4.5显然也允许更大的arrays 。
关于数组长度顺便说一下int
:还有LongLength
,返回long
。 这是在.NET 1.1中,可能是一个面向未来的变化。
为什么长数被允许作为数组长度?
答案是:long in .net表示Int64
根据规范,数组索引可以是Int64。
第二个问题:为什么要显示overflowexception?
因为任何单个对象都不能分配超过2GB的内存。
它是CLR的限制,没有单个对象可以超过2GB,包括数组:
大数组C#OutOfMemoryException
这与32位或64位操作系统无关。 也就是说,它不会阻止你总共使用超过这个数量,而不是一个对象。
这是一个运行时错误,因为如果将long
(或其他初始化值)保持在范围内,它将起作用。
您可以使用所有整数类型初始化数组: sbyte
, char
, short
, int
和long
– 所有编译; 无符号变体也可以工作。
.Net 4.5-4.6中有一个解决方案,允许大型数组。
https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx
long
是一个整数类型,因此可用于定义数组; 例外是构建太大的数组,而不是特别使用long
。
例如,这很好用:
上述就是C#学习教程:为什么在C#中允许“long”作为数组长度?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
long size = 20; byte[] array = new byte[size];
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1042950.html