C# 在using语句中停止调试模式是否会关闭文件流?

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

这只是我在编写zip提取方法时的一个想法

我有一个用于OpenRead方法的using语句,所以我们都知道,一旦该语句运行,就应该释放资源。然而,在编写代码时,我正在调试,有几次,我停止了调试,以更改using语句中的一些代码。但是,当我停止调试时,using语句还没有完全运行,因此从技术上讲,它没有释放/关闭任何资源。。当您停止调试时,VisualStudio是否会自动执行此操作

环顾四周,但找不到任何提示。我正在使用Visual Studio Community 2017(版本15.9.10)和.NET Framework(版本4.7.03056)


我希望它能关闭所有流/资源,但只是好奇而已。

当你停止调试器时,你实际上是在杀死一个进程。您要求它停止——您没有要求它礼貌地解除一切,因为这可能会执行任意数量的代码

当您在调试器中单击“停止”时,您唯一应该想到的是进程可能会退出。没有更多的承诺


这与定期执行相同
使用
是一种
尝试
/
最终
,并且没有保证最终将执行;如果有人杀死了进程:它将不会执行。如果有人拔下电源线:它不会执行。等。
最后
只会在正常的执行路径下执行(无论是通过成功还是异常)。

当您停止调试器时,实际上是在终止进程。您要求它停止——您没有要求它礼貌地解除一切,因为这可能会执行任意数量的代码

当您在调试器中单击“停止”时,您唯一应该想到的是进程可能会退出。没有更多的承诺


这与定期执行相同
使用
是一种
尝试
/
最终
,并且没有保证最终将执行;如果有人杀死了进程:它将不会执行。如果有人拔下电源线:它不会执行。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);
                    }
                }
            }
        }