Ранее я предполагал, что вы смотрите на исходный код, но из ваших комментариев это звучит так, как будто вы смотрите на восстановленный C # Reflector, основанный на MSIL.Важно понимать, что это не обязательно имеет близкое сходство с исходным кодом, как написано.
На уровне MSIL не существует такой вещи, как цикл for
или цикл while
.Есть только условные инструкции ветки.(См. Здесь: http://weblogs.asp.net/kennykerr/archive/2004/09/23/introduction-to-msil-part-6-common-language-constructs.aspx) Любой инструмент, пытающийся воссоздать C #, должен сделать несколько предположений о том, как изначально был структурирован код.Кажется вероятным, что это изначально не было записано как цикл for
, но что Reflector обнаружил, что IL мог быть сгенерирован циклом for
, и его эвристика сделала неверное предположение, что ондолжен быть цикл for
, а не что-то еще.
Если я посмотрю на тот же код в ILSpy, он будет отображен как цикл while
.Это все еще избыточно, но выглядит намного менее странно.Более того, возможно, что исходный код действительно что-то оптимизировал, например, вызовы методов [Conditional]
или кода, помеченного директивами #if
.С другой стороны, возможно, оригинальный код, используемый для чего-то другого, но части были закомментированы - комментарии не хранятся в IL.Или, может быть, в прошлом было больше кода, и он был просто удален.
Короче говоря, есть много способов, которые вы видите в Reflector, может сильно отличаться от того, что было изначально написано.Вы должны считать это более симпатичным представлением IL, а не примером C #, написанным людьми.