【问题标题】:C# Array IndexerC# 数组索引器
【发布时间】:2018-10-18 10:28:50
【问题描述】:

我想知道:C# 数组索引器是如何实现的? 您可以使用从 ulongsbyte 的基本上每个整数值来索引 C# 数组,内部实现是否每次都简单地转换为通用类型?

要明确的是:

ulong i = 10;
var o = myArray[i];

被翻译成类似:

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

?

【问题讨论】:

  • 祝你在源代码中找到它。
  • @Zohar:您可能应该链接到 JIT 中 IL 指令的实现,因为这就是那里发生的事情,而不是对 System.Array 的方法调用。
  • 请注意,检查实际上并没有被执行。 JiT 和一般 IL 优化确实有助于保持低负载:blogs.msdn.microsoft.com/clrcodegeneration/2009/08/13/…
  • 谢谢大家!

标签: c# arrays casting indexer


【解决方案1】:

数组索引器的类型是整数,所以是的,值将被转换为 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 指令。

将评估堆栈顶部的无符号值转换为有符号的本机 int,在溢出时抛出 OverflowException。

【讨论】:

  • 为您的代码显示 IL 的一种简单方法是 SharpLab.io - 适合对此答案的好奇读者。
  • 谢谢!在询问之前我确实尝试过 SharpLab.io,但我仍然不能很好地理解 IL,这就是我问这个问题的原因:)
  • 我知道这个答案会保持不变,但如果你想用 IL 来“证明”这类问题,你需要在强制 x64 和 x32 平台上重复这个,优化开/关,. ...你甚至没有提到你的设置。我总是更喜欢规范。
猜你喜欢
  • 2010-10-28
  • 2011-04-29
  • 2016-07-16
  • 1970-01-01
  • 2018-04-27
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多