【问题标题】:What happens if StreamReader or StreamWriter are not closed?如果 StreamReader 或 StreamWriter 没有关闭会发生什么?
【发布时间】:2012-09-28 20:02:18
【问题描述】:

我正在为一位对LOC 要求严格的教授做作业。出于这个原因,我想做以下事情:

(new StreamWriter(saveFileDialog.FileName)).Write(textBox.Text);

而不是

StreamWriter sw = new StreamWriter(saveFileDialog.FileName);
sw.Write(textBox.Text);
sw.Close();

在第一个示例中,我没有关闭流。这个可以吗?它会导致任何安全或内存问题吗?

【问题讨论】:

  • 无意冒犯你,但这是一个非常愚蠢的要求。我不知道任何合法的公司会说,“你不能为这个项目编写超过 N 行代码。”用这种方式教学到底有什么用?
  • 如果行数对你的导师来说很重要......也许他应该教英语。
  • 我有一位英语教授,他给 LOC 打分。请告诉您的导师,较少的 LOC 并不能保证总是更快地执行。
  • @MichaelTodd 我同意,这就是为什么我对他的教学风格感到恼火。

标签: c# streamwriter


【解决方案1】:

您可能没有得到任何输出,或者输出不完整。关闭 writer 也会刷新它。我根本不会手动调用Close,而是使用using 语句...但是如果您只是尝试将文本写入文件,请使用一次性@987654321 @调用:

File.WriteAllText(saveFileDialog.FileName, textBox.Text);

【讨论】:

    【解决方案2】:

    也许你的导师正在寻找:

    File.WriteAllText(saveFileDialog.FileName, textbox.Text);
    

    选择简洁的代码是合理的,但不能以牺牲可读性或正确性为代价。

    【讨论】:

      【解决方案3】:

      没有 fout.Close() 的最简单解决方案应该是:

              using (StreamWriter fout = new StreamWriter(saveFileDialog.FileName))
              {
                  fout.Write(textBox.Text);
              }
      

      【讨论】:

        【解决方案4】:

        如果你不关闭它,你不能保证它会写出最后一条写入它的数据。这是因为它使用了一个缓冲区,并且当您关闭流时缓冲区会被刷新。

        其次,它会将文件锁定为打开状态,防止其他进程使用它。

        使用文件流最安全的方法是使用 using 语句。

        【讨论】:

        • +1 似乎提到 using 语句比实际的直接答案更受欢迎。(虽然不是我个人的意见):)
        【解决方案5】:

        简短的回答,为该操作分配的资源不会被释放,更不用说它可能会锁定该文件。

        【讨论】:

          【解决方案6】:

          考虑

          using( var fout = new StreamWriter(saveFileDialog.FileName){ fout.write(textBox.Text); }
          

          【讨论】:

            【解决方案7】:

            GC 将如何为您关闭它。但问题是在 GC 关闭该流之前,您没有必要暂停资源

            【讨论】:

              【解决方案8】:

              您可以尝试使用using blok 以便clean your no managed object

                      using (var streamWriter = new StreamWriter(saveFileDialog.FileName))
                      {
                          streamWriter.Write(textBox.Text);
                      }
              

              【讨论】:

                【解决方案9】:

                这会造成内存危害。

                我总是在“使用”语句中使用 StreamWriter

                using(StreamWriter fout = new StreamWriter(saveFileDialog.FileName)
                {
                    fout.Write(textBox.Text);
                }
                

                【讨论】:

                • 在关闭 StreamWriter 之前,您也无法在任何其他进程中访问该文件。
                • 所以using语句后会自动关闭,对吧?
                • @IvanLi 它会自动处理 StreamWriting。在 using 语句中声明的任何内容都会在语句结束时处理掉。
                • @Freeman 为什么在这种情况下不使用隐式类型?
                • 因为它更具人类可读性,而且我们不使用 JavaScript
                猜你喜欢
                • 2017-10-06
                • 1970-01-01
                • 2011-02-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多