2013-01-31 46 views
2

可能重複:
What is the C# Using block and why should I use it?效益/使用的StreamWriter使用前聲明,StreamReader的

所以我剛剛注意到,在MSDN的例子和計算器的一些問題有答案的地方using語句在streamwriter之前使用,但實際上有什麼好處?因爲我從來沒有被教過/被告知/讀過任何理由使用它。

  using (StreamReader sr = new StreamReader(path)) 
      { 
       while (sr.Peek() >= 0) 
        Console.WriteLine(sr.ReadLine()); 
      } 

代替:

  StreamReader sr = new StreamReader(path); 
      while (sr.Peek() >= 0) 
       Console.WriteLine(sr.ReadLine()); 

回答

6

的使用塊調用自動使用的對象的Dispose方法,和良好的一點是,它是保證被調用。因此,不管在語句塊中是否拋出異常,都會拋棄該對象。它被編譯成:

{ 
    StreamReader sr = new StreamReader(path); 
    try 
    { 
     while (sr.Peek() >= 0) 
      Console.WriteLine(sr.ReadLine()); 
    } 
    finally 
    { 
     if(sr != null) 
      sr.Dispose(); 
    } 
} 

額外的花括號放在限制sr範圍,所以它不是從使用塊的外部訪問。

+0

它實際上是編譯成一個try-finally塊。 –

+0

@DanielHilgarth絕對。我正在編輯答案。 –

+0

接受該答案!但要小心,不要返回一個處理對象,例如位圖。我看到這發生了很多。 –

1

using語句適用於實現IDisposable接口的東西。

.net將保證StreamReader將被丟棄。

您不必擔心關閉或進一步管理它:只需在「使用」範圍內使用您所需要的即可。

1

它會自動爲您調用StreamReader.Dispose()方法。如果您選擇不使用using關鍵字,則在運行代碼塊後最終會產生一個打開的流。如果你想保留一個文件(等)以便繼續使用,這是有益的,但是如果你不打算在完成時手動處理它,這可能是不好的做法。

2

使用提供了一種方便的語法,以確保正確使用IDisposable對象。它被編譯成:

StreamReader sr = new StreamReader(path); 
try 
{ 
    while (sr.Peek() >= 0) 
     Console.WriteLine(sr.ReadLine()); 
} finally 
{ 
    sr.Dispose(); 
} 

As documented on MSDN

相關問題