我知道在JavaScript中,像这样创建一个for循环:for(int i = 0; i < arr.length; i++)
因为它每次都计算数组长度,所以代价很高.对于列表和数组,这种行为在c#中是否代价高昂.或者在编译时它是否经过优化?还有其他语言如Java,这是如何处理的?
它在C#中并不昂贵.一方面,没有"计算":由于内联,查询长度基本上是一个基本操作.其次,因为(根据其开发人员),编译器识别这种访问模式,并且实际上将优化任何(冗余)边界检查以访问数组元素.
顺便说一句,我相信类似的东西对于现代JavaScript虚拟机来说也是如此,如果还没有,那么很快就会发生这种情况,因为这是一个微不足道的优化.
所有.Net数组都有一个包含数组长度的字段,因此在使用时但在创建时不会计算长度.
.Net虚拟机非常擅长在可能的情况下消除边界检查,这是其中一种情况,其中边界检查被移动到循环之外(在大多数情况下,如果不是,它只是2个指令开销).
编辑:
阵列边界检查消除