C# 数组索引器

3
我想知道:C#数组索引器是如何实现的? 你可以用基本上任何从 ulongsbyte 的整数值对C#数组进行索引,那么内部实现是否每次只需将类型强制转换为通用类型? 要明确的是,这样做会不会使以下操作成为可能:
ulong i = 10;
var o = myArray[i];

be translated into something like:

ulong i =10;
var o = myArray[(int /*or whatver is the default type used*/)i];

?


3
感谢您的请求。以下是对您提供的链接中的单词“Enjoy”的翻译:享受 - Zohar Peled
2
在源代码中找到那个可能有点困难,祝你好运。 - Selman Genç
2
@Zohar:你可能应该链接到JIT中IL指令的实现,因为那是发生的事情,而不是对System.Array的方法调用。 - Joey
请注意,检查并不总是被执行。JiT和一般的IL优化可以真正帮助保持负载低:https://blogs.msdn.microsoft.com/clrcodegeneration/2009/08/13/array-bounds-check-elimination-in-the-clr/ - Christopher
谢谢大家! - Alakanu
1个回答

5

数组索引器的类型是整数,因此是的,该值将被转换为int。您可以通过检查 IL 代码来验证这一点。给出以下示例:

var myArray = new[]{ 1,2,3 };
ulong i = 10;
var o = myArray[i];

这将编译为:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       29 (0x1d)
  .maxstack  3
  .locals init ([0] int32[] myArray,
           [1] uint64 i,
           [2] int32 o)
  IL_0000:  nop
  IL_0001:  ldc.i4.3
  IL_0002:  newarr     [mscorlib]System.Int32
  IL_0007:  dup
  IL_0008:  ldtoken    field valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=12' '<PrivateImplementationDetails>'::E429CCA3F703A39CC5954A6572FEC9086135B34E
  IL_000d:  call       void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array,
                                                                                                      valuetype [mscorlib]System.RuntimeFieldHandle)
  IL_0012:  stloc.0
  IL_0013:  ldc.i4.s   10
  IL_0015:  conv.i8
  IL_0016:  stloc.1
  IL_0017:  ldloc.0
  IL_0018:  ldloc.1
  IL_0019:  conv.ovf.i.un
  IL_001a:  ldelem.i4
  IL_001b:  stloc.2
  IL_001c:  ret
} // end of method Program::Main

转换发生在IL_0019处,使用conv.ovf.i.un指令。

将评估堆栈顶部的无符号值转换为有符号本机整数,如果溢出则抛出OverflowException异常。


一个展示代码IL的简单方法是https://SharpLab.io - 供阅读本答案的好奇读者使用。 - AndreasHassing
谢谢!在提问之前我确实尝试过SharpLab.io,但我仍然不太理解IL,这就是为什么我提出了这个问题的原因 :) - Alakanu
我知道这个答案会保持不变,但如果你想用IL来“证明”这种问题,你需要在强制使用x64和x32平台、优化开/关等情况下重复进行。你甚至没有提及你的设置。我总是更喜欢有一个规范。 - bommelding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接