(潜在的に)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...
}
}
}
}
オブジェクトがnullでない場合にのみDispose
が呼び出され、NullReferenceException
を取得しないことが保証されていますか?
はい、Dispose()
はnull以外のオブジェクトでのみ呼び出されます。
using
の展開では、null
を呼び出す前に、オブジェクトがDispose
ではないことを確認します。したがって、安全です。
あなたの場合、次のようなものが得られます:
IDisposable x = GetObject("invalid name");
try
{
// etc...
}
finally
{
if(x != null)
{
x.Dispose();
}
}
大丈夫です:
using ((IDisposable)null) { }
ここで例外はスローされません。
補足:例外がスローされるforeach
およびIEnumerable
と間違えないでください。
はい、参照を破棄する前にnullチェックが行われます。 Reflectorでコードを表示して、自分自身を調べることができます。