Для каждого выхода петли немедленно - PullRequest
4 голосов
/ 07 марта 2012

Я конвертирую проект VB6 в C #. Я сталкивался с некоторым VB6, который я не совсем понимаю (и у меня вообще нет возможности отлаживать). Это цикл, который завершается немедленно, прежде чем что-либо делать:

For Each objSubFolder In objFolder.SubFolders
  Exit For
Next

Может кто-нибудь объяснить это? Я уверен, что это что-то делает. Я предполагаю, что это присвоение переменной или что-то в этом роде. Если это так, он делает это только один раз?

Ответы [ 3 ]

6 голосов
/ 07 марта 2012

Если objSubFolder существует вне области действия For Each (согласно вашему комментарию), код будет примерно эквивалентен этому c #

var folders = Directory.GetDirectories(@"c:\someFolder");
var firstFolder=folders.FirstOrDefault();

, т.е. найти первую подпапку данной папки (еслиэто существует).

4 голосов
/ 07 марта 2012

Этот код в основном полный no-op. Единственный потенциально значительный эффект, который имеет этот код, - это выполнение свойства или метода objFolder.SubFolders. Если у этого участника есть побочный эффект, достойный примечания, тогда этот код может быть значительным.

Это грубый эквивалент следующего кода C #

object objSubFolder = null;
using (var e = objFolder.SubFolders.GetEnumerator()) {
  if (e.MoveNext()) {
    objSubFolder = e.Current();
  }
}

Обратите внимание, что это не обязательно перевод 1-1.

  • , если objSubFolder был ранее определен в методе, это неверно перезаписало бы его значение в пустой коллекции папок
  • если код VB имеет Option Explicit Off, то вам, возможно, потребуется преобразовать objFolder.SubFolders в dynamic, чтобы приблизиться к тому же поведению.
3 голосов
/ 07 марта 2012

Exit For выходит из цикла - в основном ключевое слово C # break. Не похоже, что этот цикл делает что-то практичное ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...