Al pensar en las diferencias entre for, foreach, while y goto hace unas semanas, escribí este código de prueba. Todos los métodos se compilarán en la misma IL (a excepción de un nombre de variable en la versión foreach). En el modo de depuración, algunas declaraciones NOP estarán en diferentes posiciones.
static void @for<T>(IEnumerable<T> input)
{
T item;
using (var e = input.GetEnumerator())
for (; e.MoveNext();)
{
item = e.Current;
Console.WriteLine(item);
}
}
static void @foreach<T>(IEnumerable<T> input)
{
foreach (var item in input)
Console.WriteLine(item);
}
static void @while<T>(IEnumerable<T> input)
{
T item;
using (var e = input.GetEnumerator())
while (e.MoveNext())
{
item = e.Current;
Console.WriteLine(item);
}
}
static void @goto<T>(IEnumerable<T> input)
{
T item;
using (var e = input.GetEnumerator())
{
goto check;
top:
item = e.Current;
Console.WriteLine(item);
check:
if (e.MoveNext())
goto top;
}
}
static void @gotoTry<T>(IEnumerable<T> input)
{
T item;
var e = input.GetEnumerator();
try
{
goto check;
top:
item = e.Current;
Console.WriteLine(item);
check:
if (e.MoveNext())
goto top;
}
finally
{
if (e != null)
e.Dispose();
}
}
por @ el comentario de Eric ...
he ampliado for
, while
, 'Goto' y foreach
con matrices genéricas. Ahora la declaración for each
busca usar el indexador para la matriz. Las matrices y cadenas de objetos se expanden de manera similar. Los objetos eliminarán un boxeo que ocurra antes de que el método llame a Console.WriteLine y Strings reemplazará a T item
y T[] copy...
con char item
y string copy...
respectivamente. Tenga en cuenta que la sección crítica ya no es necesaria porque el enumerador desechable ya no se utiliza.
static void @for<T>(T[] input)
{
T item;
T[] copy = input;
for (int i = 0; i < copy.Length; i++)
{
item = copy[i];
Console.WriteLine(item);
}
}
static void @foreach<T>(T[] input)
{
foreach (var item in input)
Console.WriteLine(item);
}
static void @while<T>(T[] input)
{
T item;
T[] copy = input;
int i = 0;
while (i < copy.Length)
{
item = copy[i];
Console.WriteLine(item);
i++;
}
}
static void @goto<T>(T[] input)
{
T item;
T[] copy = input;
int i = 0;
goto check;
top:
item = copy[i];
Console.WriteLine(item);
i++;
check:
if (i < copy.Length)
goto top;
}
duplicado: http://stackoverflow.com/questions/1632810/how-does-foreach-work-when-looping-through-function-results –