对(可能)null对象使用using
语句是否安全?
请考虑以下示例:
class Test {
IDisposable GetObject(string name) {
// returns null if not found
}
void DoSomething() {
using (IDisposable x = GetObject("invalid name")) {
if (x != null) {
// etc...
}
}
}
}
是否保证仅当对象不为空时才会调用Dispose
,并且我不会获得NullReferenceException
?
答案 0 :(得分:152)
是的,Dispose()
仅在非空对象上调用:
答案 1 :(得分:29)
using
的扩展会在调用null
之前检查对象是否为Dispose
,所以是的,它是安全的。
在你的情况下,你会得到类似的东西:
IDisposable x = GetObject("invalid name");
try
{
// etc...
}
finally
{
if(x != null)
{
x.Dispose();
}
}
答案 2 :(得分:12)
你应该没问题:
using ((IDisposable)null) { }
这里没有例外。
旁注:请不要将此错误与foreach
和IEnumerable
一起引发异常。
答案 3 :(得分:1)
是的,在处置参考之前将进行空检查。您可以通过在Reflector中查看代码来检查自己。
答案 4 :(得分:-3)
根据我的经验,您不会得到空引用异常。它将被忽略。