#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
инструкции (по крайней мере, в максимально возможной степени), тогда действительно: не останавливайте отладчик. Но, чтобы подчеркнуть: это крошечное меньшинство случаев, когда это имело бы значение.