【问题标题】:C# - Should Streams always be Closed, even if they didn't open properly?C# - 是否应该始终关闭流,即使它们没有正确打开?
【发布时间】:2013-11-15 13:39:21
【问题描述】:

如果我使用 OpenFileDialog 创建一个 Stream 对象来打开一个文本文件,我应该在什么范围内关闭它?我是在同一范围内声明它,还是在 ifs 之一内声明它(在它正确打开的情况下关闭它)?。

我把代码留在这里,你可以告诉我...

Stream arch_Usuarios;

OpenFileDialog openFileDialog_arch_Usuarios = new OpenFileDialog();

if (openFileDialog_arch_Usuarios.ShowDialog() == DialogResult.OK)
{
    if ((arch_Usuarios = openFileDialog_arch_Usuarios.OpenFile()) != null)
    {
        ...
    }
}

您好。

【问题讨论】:

  • 查看using 声明。这应该可以解决这个问题。
  • “他们没有正确打开”是什么意思?
  • 如果一个流没有正确打开,你不会得到null或者一个未初始化的流,而是一个异常。
  • 旁注:使用 .net 命名转换。避免使用Abc_Def 样式

标签: c# stream visual-studio-2013 dispose


【解决方案1】:

如果您将这些资源放在using 语句中,您就不必担心了。这些对象在超出范围时会自动清理,无论代码如何退出,即使在引发异常的情况下也是如此。

using(OpenFileDialog openFileDialog_arch_Usuarios = new OpenFileDialog())
{
    if (openFileDialog_arch_Usuarios.ShowDialog() == DialogResult.OK)
    {
        using(Stream arch_Usuarios = openFileDialog_arch_Usuarios.OpenFile())
        {
            ...
        }        
    }
}

这是我对using 语句的不满。你最终得到了可笑的缩进代码。轻微的抱怨,但仍然让我烦恼。

【讨论】:

  • 在 using 语句中也需要使用OpenFileDialog
  • 是的。他们都可以进入 using 语句。我不喜欢使用语句的一件事(这是次要的)是导致的缩进。出于这个原因,我倾向于谨慎使用它们。
  • @SriramSakthivel:我认为对话不需要进入using,只有流
  • @musefan 为什么? OpenFileDialog 使用非托管系统资源,必须释放。
  • 无论哪种方式都可以争论。为了可读性,我更喜欢谨慎使用它们。 @musefan,文件对话框将在超出范围时被释放。
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 2011-03-16
  • 2011-10-18
  • 2016-08-15
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多