2012-11-13 20 views
2

我正在從microsoft site下面的示例中讀取文本文件。他們說,這樣做是這樣的:名稱'sr'在當前上下文中不存在

class Test 
{ 
    public static void Main() 
    { 
     try 
     { 
      using (StreamReader sr = new StreamReader("TestFile.txt")); 
      { 
       String line = sr.ReadToEnd(); 
       Console.WriteLine(line); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("The file could not be read:"); 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

,但是當我這樣做是在Visual C#2010它帶給我的錯誤:

可能誤以爲空語句

名「SR」在目前的情況下不存在

我刪除了using部分,現在的代碼看起來是這樣的,並正在努力:

try 
{ 
    StreamReader sr = new StreamReader("TestFile.txt"); 
    string line = sr.ReadToEnd(); 
    Console.WriteLine(line); 
} 

這是爲什麼?

更新:有在using(....);

+11

你的代碼如果可以使用。也許你在使用陳述後加上';'; –

+0

在這裏生成很好 – MaximR

+0

代碼看起來正確。 \t 在Try/Catch之後,你有更多使用sr變量的代碼嗎?如果你在外面使用sr,那麼變量沒有被定義。 PD:好的,我以另一種方式理解它,我認爲第一個代碼段正在工作,而不是第二個。對不起 –

回答

6

我只加入這個答案,因爲現有的(同時適當upvoted)只是告訴你是什麼錯誤,不爲什麼這是一個錯誤。

這樣做;

using (StreamReader sr = new StreamReader("TestFile.txt")); 
{ 
    String line = sr.ReadToEnd(); 
    Console.WriteLine(line); 
} 

實際上是相同的(語義)爲這樣:

using (StreamReader sr = new StreamReader("TestFile.txt")) 
{ 
    // Note that we're not doing anything in here 
} 
{ 
    String line = sr.ReadToEnd(); 
    Console.WriteLine(line); 
} 

第二塊(由第二組花括號創建)不會有什麼用using塊。由於using塊中定義的變量僅在該塊內,因此一旦代碼到達第二個塊,該變量就不存在(就範圍而言是可訪問的)。

因爲StreamReader實現IDisposable您應該使用using聲明。 using塊提供了一種簡單,乾淨的方式,以確保即使在例外的情況下,您的資源也能得到適當的清理。有關using塊(更具體地說,是什麼IDisposable接口)的更多信息,請參閱meta description on the IDisposable tag

14

末分號你所描述的是通過將; using語句

using (StreamReader sr = new StreamReader("TestFile.txt")); 
{ 
    String line = sr.ReadToEnd(); 
    Console.WriteLine(line); 
} 

也許你甚至沒有注意到,後來刪除後實現。

使用(StreamReader)和只是StreamReader有什麼區別?

當你把using語句一次性變量(StreamReader的),這是一樣的:

StreamReader sr = new StreamReader("TestFile.txt"); 
try 
{ 
    String line = sr.ReadToEnd(); 
    Console.WriteLine(line); 
} 
finally 
{ 
    // this block will be called even if exception occurs 
    if (sr != null) 
     sr.Dispose(); // same as sr.Close(); 
} 

此外,如果你使用塊聲明變量,它只會在使用塊可見。這就是爲什麼;使您的StreamReader在後一種情況下不存在。如果您在使用塊之前聲明sr,它將在稍後顯示,但流將被關閉。

+0

使用(StreamReader ....){}和StreamReader ...之間有什麼區別...? – cikatomo

+0

使用(StreamReader sr ...){}在清除大括號後立即清除「sr」對象。在另一種方法中,您應確保在不再使用時正確處理對象。 – Neps

+0

'using'語句自動調用本聲明中聲明的一次性對象的'Dispose'方法。當你在聲明中聲明'StreamReader'時,流將被關閉。 '使用'關閉正確的流(即使在例外情況下)。 –

2

改變這一點:

using (StreamReader sr = new StreamReader("TestFile.txt")); 

這樣:

using (StreamReader sr = new StreamReader("TestFile.txt")) 
相關問題