2012-09-29 68 views
-1

如果您使用using方法而不是可以說,該類將正確配置嗎?從方法返回正確配置對象?

private static string GetString() 
{ 
    using(FileStream fs = new FileStream("path", FileMode.Open)) 
    using(StreamReader sr = new StreamReader(fs)) 
    { 
     return sr.ReadToEnd(); 
    } 
} 

相當於:

private static string GetString() 
{ 
    string toReturn = "";   

    FileStream fs = new FileStream("path", FileMode.Open) 
    StreamReader sr = new StreamReader(fs) 

    toReturn = sr.ReadToEnd(); 

    sr.Close(); 
    fs.Close(); 

    return toReturn; 
} 

,或者:

private static string GetString() 
{ 
    FileStream fs; 
    StreamReader sr; 

    try 
    { 
     string toReturn = "";   

     fs = new FileStream("path", FileMode.Open) 
     sr = new StreamReader(fs) 

     toReturn = sr.ReadToEnd(); 

     sr.Close(); 
     fs.Close(); 

     return toReturn; 
    } 
    finally 
    { 
     if(sr != null) 
      sr.Close(); 

     if(fs != null) 
      fs.Close(); 
    } 
} 
+1

通過使用搜索引擎找到C#''using'的文檔有多困難? –

+0

http://stackoverflow.com/questions/667111/some-advanced-questions-on-the-using-statement –

回答

2

using聲明生成的代碼與您的第二個示例非常相似(最大的區別是它調用IDisposable.Dispose而不是Close)。它將始終正確處理對象,無論該方法是通過return還是拋出的異常退出。

如果你很好奇,這是不using S中的C#代碼編譯爲相同的IL作爲你的榜樣與using S:

private static string GetString() 
{ 
    FileStream fs = new FileStream("path", FileMode.Open); 
    try 
    { 
     StreamReader sr = new StreamReader(fs); 
     try 
     { 
      return sr.ReadToEnd(); 
     } 
     finally 
     { 
      if (sr != null) 
       ((IDisposable)sr).Dispose(); 
     } 
    } 
    finally 
    { 
     if (fs != null) 
      ((IDisposable)fs).Dispose(); 
    } 
} 
+0

這不是它如何編譯 - 聲明在'try'之外,賦值在裏面(否則,沒有辦法輸入帶有'fs'非null的'try'塊,在這種情況下,爲什麼在'finally'中檢查非null值 –

+0

我不同意我正在查看每個在ILSpy中反編譯的http: //ilspy.net/唯一的區別在於一些'nop'操作(奇怪的是,我用VS2012在Release模式下構建;但那不是重點)。包含非null檢查是因爲您可以擁有完成'使用(FileStream fs = null)',或者更可能'使用(var fs = GetSomething())',它可能已經返回null。 –

0

如果它實現IDisposable當使用塊退出它將被正確關閉。

1

看看using聲明:

http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx

它應該等於:

FileStream fs = null; 

try 
{ 
    fs = new FileStream("path", FileMode.Open); 
    StreamReader sr = null; 
    try 
    { 
     sr = new StreamReader(fs); 
     toReturn = sr.ReadToEnd(); 
     return toReturn; 
    } 
    finally 
    { 
     if(sr != null) 
      sr.Dispose(); 
    } 
} 
finally 
{ 
    if(fs != null) 
     fs.Dispose(); 
} 

裏面的Dispose方法,它會調用Close流。

+0

這不是它編譯的方式 - 聲明不在try中。 ,分配是在裏面(否則,沒有辦法輸入帶有'fs'非null的'try'塊,在whi ch case爲什麼在'finally'中檢查非null。 –

+0

@Damien_The_Unbeliever:沒錯 –