在我的公司,我看到這樣的代碼是「使用{}」良好做法處置對象,即使沒有變量引用它
using (LoggerFactory.GetTracer(_log.ModuleName + "._GetAccessTokenFromWns"))
{...}
當我擡起頭來,我才知道其配置的由「使用」括號內聲明的變量引用的對象。
它是否也有助於像上面這樣的代碼,其中沒有引用工廠返回的對象的變量?
感謝,對象的
在我的公司,我看到這樣的代碼是「使用{}」良好做法處置對象,即使沒有變量引用它
using (LoggerFactory.GetTracer(_log.ModuleName + "._GetAccessTokenFromWns"))
{...}
當我擡起頭來,我才知道其配置的由「使用」括號內聲明的變量引用的對象。
它是否也有助於像上面這樣的代碼,其中沒有引用工廠返回的對象的變量?
感謝,對象的
後,我看到你的問題我寫了一個簡單的代碼是這樣的:
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說這個或那個是好的,但沒有任何替代實際顯示在未分配的對象上調用dispose。 – Ricibob
「處置」包括清理它可能已初始化供自己使用的任何資源。重要的任務是不清理參考,它是清除文件鎖,互斥等。
我相信它仍然有同樣的效果。如果GetTracer
正在返回實現IDisposable
的類的實例,那麼此代碼將確保該實例已妥善處置。僅僅因爲沒有分配回報價值並不意味着需要處置的資源沒有分配。例如tracer可能會打開一個文件,並且沒有聲明文件鎖定/流式讀取器或任何我不想要的資源。
我想,爲了跟蹤正常工作,我們需要使用這種機制。因此,日誌文件只能在任何實例中被一個代碼訪問,並且當一個鎖被「處置」時,其他代碼也可以鎖定並記錄其消息。謝謝... –
這是確保處理對象而不引入變量的唯一方法。這與
var __invisible = LoggerFactory.GetTracer(_log.ModuleName + "._GetAccessTokenFromWns");
try {
} finally {
__invisible.Dispose();
}
但是沒有__invisible
變量。
這個構造在你做的情況下特別有價值不是需要一個變量,因爲熟悉這個習慣用法的讀者會發現這樣的代碼更具可讀性。
好點。使用聲明不僅可以在不引用它的情況下處理對象,而且可以僅用*方式。 –
不需要變量,編譯器會分配一個未命名的變量來存儲引用。不管你是否使用一個命名變量,它不會信任你,並期望你做一些不明智的事情,比如在using塊中分配另一個引用。它在運行時無關緊要。用ildasm.exe查看MSIL以查看此信息。 –