我已经运行ildasm找到了这个:
using(Simple simp = new Simple())
{
Console.WriteLine("here");
}生成等同于以下内容的IL代码:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
if(simp != null)
{
simp.Dispose();
}
}问题是,为什么它会在最后检查null呢?finally块仅在try块被执行时执行,try块仅在简单构造函数成功(即不抛出异常)时才执行,在这种情况下,simp将为非空。(如果有人担心在简单构造函数和try块的开头之间可能会出现一些干预步骤,那么这将是一个真正的问题,因为这样可能会抛出一个异常,从而完全阻止finally块的执行。)那么,为什么见鬼呢?
把using语句是否比try-finally更好的争论放在一边,我把try-finally块写成:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
simp.Dispose();
simp = null; // sanity-check in case I touch simp again
// because I don't rely on all classes
// necessarily throwing
// ObjectDisposedException
}发布于 2009-06-03 20:25:14
不,finally块将始终被执行。您可能不是从新的函数中获取对象,而是从返回您的对象的其他函数中获取对象-它可能会返回NULL。使用()是您的朋友!
dss539很客气地建议我加上他的笔记:
using(Simple simp = null) 是扩展必须首先检查null的另一个原因。
发布于 2009-06-03 20:31:16
using(Simple simp = null)仍然是的另一个原因,即扩展必须首先检查null。
发布于 2009-06-03 21:04:33
using语句上的MSDN。
我觉得奇怪的是,它并没有扩展到:
Simple simp = new Simple();
Simple __compilergeneratedtmpname = simp;
try
{
Console.WriteLine("here");
}
finally
{
if(__compilergeneratedtmpname != null)
{
__compilergeneratedtmpname.Dispose();
}
}https://stackoverflow.com/questions/946999
复制相似问题