Закрывает ли файловый поток остановка режима отладки в инструкции using?

#c# #.net #visual-studio #ziparchive

#c# #.net #visual-studio #архивация

Вопрос:

Просто мысль, которая возникла, когда я писал метод извлечения zip.

У меня есть инструкция using для метода OpenRead, поэтому ресурсы должны быть удалены после выполнения инструкции, хотя, как мы все знаем. Однако во время написания кода я выполнял отладку и пару раз останавливал отладку, чтобы изменить некоторый код в инструкции using. Однако, когда я остановил отладку, инструкция using не была выполнена полностью, поэтому технически не утилизировала / закрыла какие-либо ресурсы.. Visual Studio делает это автоматически, когда вы останавливаете отладку?

Бегло осмотрелся, но не смог найти никаких подсказок. Я использую Visual Studio Community 2017 (версия 15.9.10) и .NET Framework (версия 4.7.03056)

         public void Decompress_SaveToFile(string zipFilePath, string directoryPath)
        {
            using (ZipArchive archive = ZipFile.OpenRead(zipFilePath))
            {
                foreach(ZipArchiveEntry entry in archive.Entries)
                {
                    if(File.Exists(directoryPath))
                    {
                        Console.WriteLine("Decompressed file already exists.");
                    }
                    else
                    {
                        entry.ExtractToFile(directoryPath);
                    }
                }
            }
        }
  

Я ожидаю, что это закроет все потоки / ресурсы, но просто любопытно.

Комментарии:

1. using Инструкция — это просто прославленный try-finally блок, где вся логика dispose записана в finally блоке, поэтому, независимо от того, генерирует ли он исключение, он будет правильно распоряжаться ресурсом.

2. Это не проблема. Задача операционной системы — закрыть все оставшиеся открытые дескрипторы файлов при завершении программы.

Ответ №1:

Когда вы останавливаете отладчик, вы, по сути, останавливаете процесс. Вы попросили его остановить — вы не просили его вежливо все размотать, что могло бы выполнить произвольные объемы кода.

Когда вы нажимаете stop в отладчике, единственное, чего вам следует ожидать, это того, что процесс, вероятно, завершится. Больше ничего не обещано.

Это то же самое, что и при обычном выполнении; using это try / finally , и нет гарантии, что finally выполнится; если кто-то завершит процесс: он не будет выполняться. Если кто-то отключит кабель питания: он не будет выполняться. И т.д. finally будет выполняться только во время изящного обычного пути выполнения (будь то через успех или исключение).

Комментарии:

1. Спасибо, Марк, это хорошо объясненный ответ. Итак, основываясь на вашем ответе, я предполагаю, что это плохая привычка, от которой мне следует отказаться?

2. @DylanDelport это действительно зависит от того, что делает ваш код 🙂 в большинстве случаев это действительно не имеет значения — прерывание процесса приведет к освобождению любых заблокированных файлов и т.д., И обычно всего, что находится в вашей папке debug bin … не имеет значения, поврежден ли он. Если вам абсолютно необходимо запускать ваши finally инструкции (по крайней мере, в максимально возможной степени), тогда действительно: не останавливайте отладчик. Но, чтобы подчеркнуть: это крошечное меньшинство случаев, когда это имело бы значение.