有人請向我解釋爲什麼下面顯示的代碼在C#中有效,並執行Console.WriteLine
的調用?爲什麼在C#中使用(null)有效的情況?
using (null)
{
Console.WriteLine ("something is here")
}
它編譯成(finally塊顯示)。正如你所看到的,編譯器決定不執行Dispose()
方法並跳轉到endfinally
指令。
IL_0013: ldnull
IL_0014: ceq
IL_0016: stloc.1
IL_0017: ldloc.1
IL_0018: brtrue.s IL_0021 // branches here and decide not to execute Dispose()
IL_001a: ldnull
IL_001b: callvirt instance void [mscorlib]System.IDisposable::Dispose()
IL_0020: nop
IL_0021: endfinally
但是,如果我運行下面的代碼,它將失敗,一個NullReferenceException
(預計):
((IDisposable)null).Dispose();
IL_0023: ldnull
IL_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
爲什麼第一個版本編譯?爲什麼編譯器決定不執行Dispose()
?在編譯器可能決定不調用using
塊中的Dispose()
時是否還有其他情況?
嗯...我現在非常懷疑這個帖子的,因爲Eric的最近的博客......這真的是一個真正的問題嗎? – 2011-03-04 08:44:05
這不是已經問過嗎? http://stackoverflow.com/questions/2522822/c-using-statement-with-a-null-object – 2011-03-04 08:49:17
是的,它似乎對我有所臆造。 – 2011-03-04 09:09:04