C# 在using语句中停止调试模式是否会关闭文件流?
这只是我在编写zip提取方法时的一个想法 我有一个用于OpenRead方法的using语句,所以我们都知道,一旦该语句运行,就应该释放资源。然而,在编写代码时,我正在调试,有几次,我停止了调试,以更改using语句中的一些代码。但是,当我停止调试时,using语句还没有完全运行,因此从技术上讲,它没有释放/关闭任何资源。。当您停止调试时,VisualStudio是否会自动执行此操作 环顾四周,但找不到任何提示。我正在使用Visual Studio Community 2017(版本15.9.10)和.NET Framework(版本4.7.03056)C# 在using语句中停止调试模式是否会关闭文件流?,c#,.net,visual-studio,ziparchive,C#,.net,Visual Studio,Ziparchive,这只是我在编写zip提取方法时的一个想法 我有一个用于OpenRead方法的using语句,所以我们都知道,一旦该语句运行,就应该释放资源。然而,在编写代码时,我正在调试,有几次,我停止了调试,以更改using语句中的一些代码。但是,当我停止调试时,using语句还没有完全运行,因此从技术上讲,它没有释放/关闭任何资源。。当您停止调试时,VisualStudio是否会自动执行此操作 环顾四周,但找不到任何提示。我正在使用Visual Studio Community 2017(版本15.9.10
我希望它能关闭所有流/资源,但只是好奇而已。当你停止调试器时,你实际上是在杀死一个进程。您要求它停止——您没有要求它礼貌地解除一切,因为这可能会执行任意数量的代码 当您在调试器中单击“停止”时,您唯一应该想到的是进程可能会退出。没有更多的承诺
这与定期执行相同
使用
是一种尝试
/最终
,并且没有保证最终将执行;如果有人杀死了进程:它将不会执行。如果有人拔下电源线:它不会执行。等。最后
只会在正常的执行路径下执行(无论是通过成功还是异常)。当您停止调试器时,实际上是在终止进程。您要求它停止——您没有要求它礼貌地解除一切,因为这可能会执行任意数量的代码
当您在调试器中单击“停止”时,您唯一应该想到的是进程可能会退出。没有更多的承诺
这与定期执行相同
使用
是一种尝试
/最终
,并且没有保证最终将执行;如果有人杀死了进程:它将不会执行。如果有人拔下电源线:它不会执行。Etc.finally
将仅在正常的执行路径下执行(无论是通过成功还是异常)。using语句只是一个美化的try finally
块,其中所有的dispose逻辑都写入finally
块,因此,不管它是否抛出异常,它都会正确地处理资源。这不是问题。操作系统的任务是在程序终止时关闭所有剩余打开的文件句柄。using
语句只是一个美化的try finally
块,其中所有的dispose逻辑都写入finally
块,因此,不管它是否抛出异常,它都会正确地处理资源。这不是问题。操作系统的任务是在程序终止时关闭所有剩余打开的文件句柄。谢谢Marc,这是一个解释得很好的答案。所以根据你的回答,我认为我应该停止这是一个坏习惯?@DylanDelport,这实际上取决于你的代码在做什么:)在大多数情况下,这真的不重要-拆除进程将释放任何锁定的文件等,通常还有你的调试箱文件夹中的任何东西。。。不管它是否被破坏。如果您确实需要运行finally
语句(至少,尽可能多),那么确实:不要停止调试器。但要强调的是:这在少数情况下很重要。谢谢马克,这是一个解释得很好的答案。所以根据你的回答,我认为我应该停止这是一个坏习惯?@DylanDelport,这实际上取决于你的代码在做什么:)在大多数情况下,这真的不重要-拆除进程将释放任何锁定的文件等,通常还有你的调试箱文件夹中的任何东西。。。不管它是否被破坏。如果您确实需要运行finally
语句(至少,尽可能多),那么确实:不要停止调试器。但要强调的是:在极少数情况下,这一点很重要。
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);
}
}
}
}