2013-12-12 61 views
0

我試圖找出如果我可以在使用語句內關閉這樣的流,並打開另一個?使用語句關閉對象內的對象

下面是代碼:

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

嘗試在視覺工作室,看看會發生什麼 – Habib

+0

這是偉大的建議。去嘗試一下! – Phil

回答

0

無論是否有可能發生什麼,只是不這樣做。爲什麼?因爲:

  1. 它的醜陋,
  2. 這是對using聲明的目的,
  3. 它幾乎沒有可讀的代碼,
  4. 它的維護不善,
  5. 它被其他人,而不是不undestandable即使是從明天開始,
  6. 這是一個明顯的代碼氣味 - 一個跡象,你幾乎不知道自己在做什麼,你正在努力以適當的方式構建代碼。

更新:點(3)和(5)以上是我誤解你的代碼,還以爲你在指定的TextReader新實例爲obj2的直接後果。我只是沒有發現有一個其他變量obj與一個幾乎不同的名字。

+0

@downvoter downvoter是否在意評論? –

1

你舉的例子是正確的。但是,您不能「重複使用」obj2;該變量只能在using塊內讀取。使用不同的對象引用關閉並重新打開相同的文件是安全的; using關鍵字只是保證Dispose()將在塊的末尾被調用。在StreamReader,Dispose()只是關閉流,但既然你已經在塊內完成,沒有什麼會發生。

另外請注意,在你的榜樣,obj不受using保護:你是不是保證obj.Dispose()將塊退出之前被調用。不過,這是可以的,因爲你自己明確地關閉了流。