不管尺寸如何,索引数组都是一种方法调用,因为它涉及到调用indexer运算符。
那么,为什么是该方法的过载System.Linq.Expressions.Expression.ArrayIndex
的是采用单个数组索引作出返回BinaryExpression
而其other overloads
,代表索引多维数组,以返回是由MethodCallExpression
S'
这只是打破了对称性,迫使我想起这个小异常现象。如果他们做到了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] 删除。
我来说两句