想知道幾周前for,foreach,while和goto之間的區別,所以我寫了這個測試代碼。所有的方法都會編譯成相同的IL(除了foreach版本的變量名)。在調試模式下,一些NOP語句將處於不同的位置。
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();
}
}
每@ Eric的評論...
我已經擴大for
,while
, '轉到' 和foreach
與通用陣列。現在for each
語句看起來使用數組的索引器。對象數組和字符串以類似的方式展開。對象將刪除方法調用Console.WriteLine和字符串之前發生的拳擊分別將和T[] copy...
分別替換爲char item
和string copy...
。請注意,關鍵部分不再需要,因爲不再使用一次性枚舉器。
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;
}
重複:http://stackoverflow.com/questions/1632810/how-does-foreach-work-when-looping-through-function-results – 2010-03-15 13:51:04