2014-02-20 32 views
2

在我的公司,我看到這樣的代碼是「使用{}」良好做法處置對象,即使沒有變量引用它

using (LoggerFactory.GetTracer(_log.ModuleName + "._GetAccessTokenFromWns")) 
{...} 

當我擡起頭來,我才知道其配置的由「使用」括號內聲明的變量引用的對象。

它是否也有助於像上面這樣的代碼,其中沒有引用工廠返回的對象的變量?

感謝,對象的

+0

不需要變量,編譯器會分配一個未命名的變量來存儲引用。不管你是否使用一個命名變量,它不會信任你,並期望你做一些不明智的事情,比如在using塊中分配另一個引用。它在運行時無關緊要。用ildasm.exe查看MSIL以查看此信息。 –

回答

4

後,我看到你的問題我寫了一個簡單的代碼是這樣的:

using (new FileStream("sample.txt",FileMode.CreateNew)) 
{ 

} 

然後我看看生產IL code

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  35 (0x23) 
    .maxstack 2 
    .locals init ([0] class [mscorlib]System.IO.FileStream CS$3$0000, 
      [1] bool CS$4$0001) 
    IL_0000: nop 
    IL_0001: ldstr  "asdas.txt" 
    IL_0006: ldc.i4.1 
    IL_0007: newobj  instance void [mscorlib]System.IO.FileStream::.ctor(string, 
                      valuetype [mscorlib]System.IO.FileMode) 
    IL_000c: stloc.0 
    .try 
    { 
    IL_000d: nop 
    IL_000e: nop 
    IL_000f: leave.s IL_0021 
    } // end .try 
    finally 
    { 
    IL_0011: ldloc.0 
    IL_0012: ldnull 
    IL_0013: ceq 
    IL_0015: stloc.1 
    IL_0016: ldloc.1 
    IL_0017: brtrue.s IL_0020 
    IL_0019: ldloc.0 
    IL_001a: callvirt instance void [mscorlib]System.IDisposable::Dispose() 
    IL_001f: nop 
    IL_0020: endfinally 
    } // end handler 
    IL_0021: nop 
    IL_0022: ret 
} // end of method Program::Main 

正如你可以看到它仍然是調用Dispose方法。在try塊之前創建FileStream實例,然後在finally中調用Dispose方法。我認爲這是using的另一個優點tatements。

+1

+1說這個或那個是好的,但沒有任何替代實際顯示在未分配的對象上調用dispose。 – Ricibob

3

「處置」包括清理它可能已初始化供自己使用的任何資源。重要的任務是不清理參考,它是清除文件鎖,互斥等。

2

我相信它仍然有同樣的效果。如果GetTracer正在返回實現IDisposable的類的實例,那麼此代碼將確保該實例已妥善處置。僅僅因爲沒有分配回報價值並不意味着需要處置的資源沒有分配。例如tracer可能會打開一個文件,並且沒有聲明文件鎖定/流式讀取器或任何我不想要的資源。

+0

我想,爲了跟蹤正常工作,我們需要使用這種機制。因此,日誌文件只能在任何實例中被一個代碼訪問,並且當一個鎖被「處置」時,其他代碼也可以鎖定並記錄其消息。謝謝... –

3

這是確保處理對象而不引入變量的唯一方法。這與

var __invisible = LoggerFactory.GetTracer(_log.ModuleName + "._GetAccessTokenFromWns"); 
try { 
} finally { 
    __invisible.Dispose(); 
} 

但是沒有__invisible變量。

這個構造在你做的情況下特別有價值不是需要一個變量,因爲熟悉這個習慣用法的讀者會發現這樣的代碼更具可讀性。

+1

好點。使用聲明不僅可以在不引用它的情況下處理對象,而且可以僅用*方式。 –

相關問題