【发布时间】:2010-04-08 05:53:43
【问题描述】:
在您在网络上找到的大多数示例中,当明确不使用“使用”时,模式看起来类似于:
SqlConnection c = new SqlConnection(@"...");
try {
c.Open();
...
} finally {
if (c != null) //<== check for null
c.Dispose();
}
如果你确实使用了“使用”并查看生成的 IL 代码,你可以看到它生成了对 null 的检查
L_0024: ldloc.1
L_0025: ldnull
L_0026: ceq
L_0028: stloc.s CS$4$0000
L_002a: ldloc.s CS$4$0000
L_002c: brtrue.s L_0035
L_002e: ldloc.1
L_002f: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_0034: nop
L_0035: endfinally
我理解为什么 IL 被翻译以检查 null(不知道您在 using 块中做了什么),但是如果您使用 try..finally 并且您可以完全控制 IDisposable 对象的使用方式在 try..finally 块中,你真的需要检查 null 吗?如果有,为什么?
【问题讨论】:
-
在使用/尝试块中将变量设置为空的情况下,是否可以防止出现空引用异常?
-
我就是这么想的
-
好问题..让我拿出我的代码涂鸦板并学习新东西。
标签: c# .net idisposable coding-style