2014-12-21 57 views
3

問題:在using語句中聲明using語句的目標對象是否有優勢,如下面的'代碼段1'中所示?聲明在C語句之外使用語句的目標對象#

「代碼段2」和「代碼段3」代碼段對我來說似乎也是有效的,但不確定第一個代碼段是否比其他兩個代碼段有一些優勢。

代碼段1

using (TextWriter w = File.CreateText("log.txt")) { 
    w.WriteLine("This is line one"); 
    w.WriteLine("This is line two"); 
    } 

代碼段2

TextWrite w = null; 
using (w = File.CreateText("log.txt")) { 
    w.WriteLine("This is line one"); 
    w.WriteLine("This is line two"); 
    } 

代碼段3

TextWriter w = File.CreateText("log.txt"); 
using (w) { 
    w.WriteLine("This is line one"); 
    w.WriteLine("This is line two"); 
    } 

UPDATE 1:當TextWriter對象被實例化時,看起來'代碼片段3'可能以第一行出現異常時資源沒有被處置。因此,前兩個片段看起來與處理資源相當,而第三個片段絕對不可取,除非第三個片段具有TextWriter對象處理的finally塊。

更新2:從彼得得到答案後,我意識到我在UPDATE 1中的觀察是不正確的。解釋如下:如果在3個片段中的任何一箇中實例化TextWriter時發生異常,則Dispose方法將永遠不會被調用,因爲沒有TextWriter對象調用此方法。

+1

這取決於你是否想在'using'塊的範圍之外訪問'w'。 –

+0

主要的一點是,當你嘗試訪問w時,編譯器會告訴你,這很好看,因爲它已經被處理掉了。 –

回答

2

與您在「UPDATE 1」中的假設相反,您的示例#2和#3是等效的。如果File.CreateText()方法調用發生異常,則不會返回對象並將其分配給w。因此,無論您是在using聲明之前還是作爲其一部分進行分配,如果該對象已成功創建,它將根據需要成功清理。

這就是說,例如#1是至少原因是有益的:

  1. 正如在其他答覆中提到,它減少了變量的作用域,使其只能在using語句塊的訪問。由於同樣的原因,在任何情況下,範圍變量都是有用的。
  2. 另一個好處(和恕我直言之一最重要的)是變量宣稱作爲using語句的一部分是隻讀的。這可以確保您不會意外編寫試圖在清理之前切換可丟棄對象的代碼,即創建一個含糊不清的情況,其中只有一個可丟棄對象由using語句清理。
+0

你對我錯過的那個微妙點是正確的。如果TextWriter未實例化,那麼由於Dispose方法始終在創建的對象上調用,因此不會被丟棄。我們不能在空對象上調用Dispose。 – Sunil

2

唯一的潛在好處是聲明變量的可見性降低(因爲它只在using塊中可見)和可讀性。

+0

...並且在使用塊之後不能再次意外地處理該物體。 – helb

+0

這就是減少能見度解決的問題 –