gpt4 book ai didi

c# - 转到ElementAt扩展方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:31 24 4
gpt4 key购买 nike

我正在查看Linq扩展方法.NET ReflectorElementAt生成的一些代码,然后看到以下代码:

public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
{
TSource current;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
Label_0036:
if (!enumerator.MoveNext())
{
throw Error.ArgumentOutOfRange("index");
}
if (index == 0)
{
current = enumerator.Current;
}
else
{
index--;
goto Label_0036;
}
}
return current;
}


我认为您无需goto语句就可以编写相同的内容。就像是:

public static TSource ElementAtBis<TSource>(this IEnumerable<TSource> source, int index)
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (index == 0)
{
return enumerator.Current;
}
else
{
index--;
}
}
throw new ArgumentOutOfRangeException("index");
}
}


所以我想知道为什么ElementAt是这样写的。这里有某种约定吗?也许规则是只有一个return语句可以成为函数的最后一行?还是我缺少有关性能的信息?还是这有问题的.NET Reflector?

附带说明一下,方法 ElementAtOrDefault不使用goto语句:

public static TSource ElementAtOrDefault<TSource>(this IEnumerable<TSource> source, int index)
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (index == 0)
{
return enumerator.Current;
}
index--;
}
}
return default(TSource);
}

最佳答案

都是反编译的问题。下一个代码是由DotPeek通过反编译mscorlib程序集的方法ElementAt生成的:

public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)

//...omitted code for validation

using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (index == 0)
return enumerator.Current;
--index;
}
throw Error.ArgumentOutOfRange("index");
}


IL指令没有 while构造。下面的代码演示了这一点:

while(true)
{
Console.WriteLine ("hi there");
}


编译成:

IL_0000:  ldstr       "hi there"
IL_0005: call System.Console.WriteLine
IL_000A: br.s IL_0000 //unconditionaly transfers control to IL_0000. It's like goto IL_0000; but in IL

关于c# - 转到ElementAt扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com