【问题标题】:Multiple using statements with if condition带有 if 条件的多个 using 语句
【发布时间】:2019-12-23 11:40:26
【问题描述】:

我需要读取一个文件并将处理后的数据写入一个或两个文件中。

在这种情况下如何组织 Using 语句? 这样的事情会起作用吗?

if (condition)
    using (var sw2 = StreamWriter(writeFile2))
using (var sr = new StreamReader(readFile))
using (var sw = StreamWriter(writeFile))
{
    var line = sr.ReadLine();
    sw.WriteLine(line);
    if (condition)
        sw2.WriteLine(line);
}

【问题讨论】:

  • 为什么不在第二个 if 中包含 using - 在 sw2.WriteLine 之前?
  • 类似using (sw2 = condition ? new StreamWriter(writeFile2) : null)的东西应该可以工作。如果条件不是微不足道的bool,则将最后一个if (condition) 替换为(if sw2 != null)

标签: c# streamreader streamwriter using-statement


【解决方案1】:

不,您的代码不正确,因为如果条件为真,则所有使用都被视为一条语句。
所以你只有在条件为真时才读/写所有文件。

相反,如果您想始终读取 readFile 并写入 writeFile 但仅当条件为真时才写入 writeFile2 那么您需要使用适当的大括号清楚地表达您的意图

using (var sr = new StreamReader(readFile))
using (var sw = StreamWriter(writeFile))
{
    var line = sr.ReadLine();
    sw.WriteLine(line);
    if (condition)
    {
        using (var sw2 = StreamWriter(writeFile2))
            sw2.WriteLine(line);
    }
}

【讨论】:

  • 在这种情况下,不会为读取的每一行打开和关闭 writeFile2 吗?
  • 您似乎只阅读了一行。你在循环中有这段代码吗?如果是,请显示它(此外,每次调用此代码时也会创建 writeFile)。
  • 对不起,史蒂夫。我应该指定行读数在循环内。
  • 好的,但是每次用当前行的内容覆盖在前一个循环中创建的文件时,以这种方式(如果您不在循环内更改目标文件)。
  • 只有一个循环,逐行读取文件并写入另外两个。
【解决方案2】:

使用块可以处理空罚款。然后,您可以执行以下操作:

using (var sr = new StreamReader(readFile))
using (var sw = StreamWriter(writeFile))
using (var sw2 = condition ? new StreamReader(writeFile2) : null)
{
    var line = sr.ReadLine();
    sw.WriteLine(line);
    sw2?.WriteLine(line);
}

我在打开流阅读器之后移动了 sw2 以便在打开读取文件失败时不会创建文件,并使用“安全导航运算符”?. 来处理 sw2 的情况在循环中为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2020-01-20
    • 2013-05-13
    • 2011-07-12
    • 1970-01-01
    • 2014-10-20
    • 2013-12-17
    相关资源
    最近更新 更多