【问题标题】:Closing an object inside the objects using statement使用语句关闭对象内的对象
【发布时间】:2013-12-12 14:39:54
【问题描述】:

我想知道是否可以在 using 语句中关闭这样的流并打开另一个流?

代码如下:

string combined = Path.Combine(path, some + ".txt");
if (File.Exists(combined))
{
    using (TextReader obj2 = new StreamReader(combined))
    {
        string line = obj2.ReadLine();
        if (line != null && !line.Contains("Mon"))
        {   
            obj2.Close();
            TextWriter obj = File.AppendText(combined);
            obj.WriteLine("Mon\t\t\t|Thue\t\t\t|Wedn\t\t\t|Thurs\t\t\t|Friday\t\t\t|Sat\t\t\t|Sun\t\t\t    ");
            obj.Close();
        }
    }
}

【问题讨论】:

  • 在visual studio中试一试,看看会发生什么
  • 这是个好建议。只是..试试吧!

标签: c# object using


【解决方案1】:

你的例子是正确的。但是,您不能“重用”obj2;该变量在using 块内是只读的。使用不同的对象引用关闭和重新打开同一个文件是安全的; using 关键字只是保证Dispose() 将在块的末尾被调用。在StreamReader 上,Dispose() 只是简单地关闭流,但由于您已经在块内完成了该操作,因此不会发生任何事情。

还请注意,在您的示例中,obj 不受using 的保护:您不保证将在块退出之前调用obj.Dispose()。不过,这没关系,因为您自己明确地关闭了流。

【讨论】:

    【解决方案2】:

    不管它是否可能以及会发生什么,不要这样做。为什么?因为:

    1. 太丑了,
    2. 这违背了using 声明的目的,
    3. 这是几乎不可读的代码,
    4. 它的可维护性很差,
    5. 这不是别人无法忍受的,从明天开始,你自己也不是,
    6. 这是一种明显的代码气味——这表明您几乎不知道自己在做什么,并且正在努力正确地构建代码。

    更新:上面第 (3) 和 (5) 点的直接后果是我误解了您的代码,并认为您将 TextReader 的新实例分配给 obj2。我只是没有发现其他变量 obj 的名称几乎不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2015-01-19
      • 1970-01-01
      相关资源
      最近更新 更多