Отладка нулевых переменных VSC17, если редактируется в foreach - PullRequest
0 голосов
/ 02 июня 2019

Я столкнулся с небольшой проблемой (на этот раз):

Когда я отлаживаю свой код в Visual Studio Community 2017 и редактирую все, что находится внутри foreach, все переменные в этой области, включая итерируемую переменную, устанавливаются в ноль.

foreach (var bFile in baseCache) {
    var file = lastFolder + "\\" + bFile.Value.relPath;
    if (!lastCache.ContainsKey(file)) {
        if (file.Length > 255) { continue; }
        // TODO: do stuff when the file isn't present in the last backup
    }

    var lFile = lastCache[file];
    var comp = bFile.Value.compare(lFile);
    if (!comp.HasFlag(FileData.CompareFlags.CRC32 & FileData.CompareFlags.Size)) {

    }
}

В этой части, например, у меня была точка останова на 4-й строке, где она указывается, если «lastCache» не содержит ключ, представленный «file» в то время.

В то время было только продолжение; Я сидел в этом месте, и я изменил его, как показано сейчас, и когда я нажал F10, чтобы пойти дальше, потому что я хотел проверить эту проблему в тот момент, все переменные, показанные во фрагменте, стали 'нулевыми'.

Может ли кто-нибудь объяснить мне, почему это происходит и как я могу избежать этого?

В настоящее время это незначительное беспокойство, когда я меняю вещи, но если это случится позже в более крупном проекте, это будет настоящей проблемой ...

Редактировать: вот ссылка на весь код, это просто консольное приложение, к счастью, это легко сделать https://www.pastiebin.com/5cf3e7dfa2985

1 Ответ

1 голос
/ 02 июня 2019

Область переменных, объявленных в теле цикла, является именно этим телом цикла.Когда вы входите в тело цикла, они еще не определены.Например, lFile и comp не будут иметь значения до тех пор, пока назначения не будут выполнены.

Если вы хотите сохранить значение в нескольких циклах, объявите переменные перед циклом.


Примечание к использованию словарей.эффективнее проверить наличие ключа и получить значение сразу с помощью TryGetValue

if (lastCache.TryGetValue(file, out string lFile)) {
    // do something with lFile.
} else {
    // file is missing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...