使用statement关闭对象内的对象

时间:2013-12-12 14:39:54

标签: c# object using

我试图找出是否可以在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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

另请注意,在您的示例中,obj不受using保护:您保证在阻止退出之前调用obj.Dispose()。不过,这是可以的,因为你自己明确地关闭了流。

答案 1 :(得分:0)

无论是否可能以及发生了什么,只是不要这样做。为什么?这是因为:

  1. 很难看,
  2. 违反了using声明的目的,
  3. 它几乎不可读代码,
  4. 维护性差,
  5. 其他人并不是不可判断的,甚至从明天开始也没有,
  6. 这是一个明显的代码味道 - 表示你几乎不知道自己在做什么,而且你正在努力正确地构建你的代码。

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