为什么索引一维数组的实例是BinaryExpression而不是MethodCallExpression?

水冷却器v2

不管尺寸如何,索引数组都是一种方法调用,因为它涉及到调用indexer运算符

那么,为什么是该方法的过载System.Linq.Expressions.Expression.ArrayIndex的是采用单个数组索引作出返回BinaryExpression而其other overloads,代表索引多维数组,以返回是由MethodCallExpressionS'

这只是打破了对称性,迫使我想起这个小异常现象。如果他们做到了MethodCallExpression,我将不必记住或留意任何事情。

乔恩·斯基特

我怀疑这是因为这就是IL中的样子。CLI具有两种不同类型的数组:向量是“ rank 1,0下界”数组,而数组是“任何等级,任何下界”数组。(是的,命名很混乱。对不起。)

向量效率更高,因为运行时可以执行更简单的算法来访问它们。IL有处理向量的特定说明,但是一般的数组访问是通过一种方法进行的。

为了演示这一点,请编译以下代码:

class Test
{
    static void Main()
    {
        int[] vector = new int[10];
        int[,] array = new int[10, 10];
        int x = vector[0];
        int y = array[0, 0];
    }
}

然后使用ildasm进行查看-该方法的最后两行编译为:

// int x = vector[0]
IL_0013:  ldloc.0
IL_0014:  ldc.i4.0
IL_0015:  ldelem.i4
IL_0016:  stloc.2

// int y = array[0, 0]
IL_0017:  ldloc.1
IL_0018:  ldc.i4.0
IL_0019:  ldc.i4.0
IL_001a:  call       instance int32 int32[0...,0...]::Get(int32,
                                                          int32)
IL_001f:  stloc.3

因此,表达式树只是将ldelem指令表示为二进制运算符(其中两个操作数可能是数组和索引),而它使用的是多维数组的方法调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么一维数组和二维数组的复制和修改数组的方法的结果不同?

为什么要使用迭代器而不是数组索引?

为什么二维数组中对象的索引返回-1?

为什么拆箱数组不是可折叠实例?

为什么有一个Observer而不是我的数组?

为什么Lucene的倒排索引使用数组而不是哈希表?

矢量/一维数组的MATLAB索引约定

为什么我在NumPy中进行矩阵矢量乘法运算会生成二维数组而不是一维矢量?

为什么二维NumPy数组的布尔索引会生成一维数组?

为什么可以像数组一样索引对象?

为什么不能选择数组的最后一个索引?

为什么下一行生成一维数组而不是二维数组?

numpy-索引多维数组的一维

为什么match.columns.get_loc返回一个布尔数组,而不是索引?

为什么索引一个Numpy列会创建一个副本,而不为行或一维数组创建一个副本?

为什么在二维数组的Numpy切片中使用负索引?

为什么Angular将索引0数组推入子数组而不是索引1?

为什么一维数组比C#中的锯齿数组快?

为什么在创建一维数组对象时需要定义数组长度?

使用一维索引访问多维数组

记录数组索引,而不是值(JavaScript)-为什么?

为什么在括号方法中索引 self 而不是实例变量

为什么这段代码的输出不是二维形式而是一维形式?

为什么这不是一个数组?

为什么二维数组在java中运行速度明显慢于一维数组

Numpy:用条件索引一维数组

为什么我们使用指向一维数组或多维数组的指针

为什么基于for循环的范围内的二维数组的元素是T*而不是T(*)[n]?

为什么 TransformedTargetRegressor 的 func 参数需要返回二维数组而不是一维数组?