Usando a instrução com um objeto nulo
-
22-09-2019 - |
Pergunta
É seguro usar o using
declaração em um objeto (potencialmente) nulo?
Considere o seguinte exemplo:
class Test {
IDisposable GetObject(string name) {
// returns null if not found
}
void DoSomething() {
using (IDisposable x = GetObject("invalid name")) {
if (x != null) {
// etc...
}
}
}
}
É garantido que Dispose
será chamado apenas se o objeto não for nulo, e eu não vou receber um NullReferenceException
?
Solução
Sim, Dispose()
é chamado apenas em objetos não nulos:
Outras dicas
A expansão para using
verifica se o objeto não é null
antes de ligar Dispose
Nele, então sim, é seguro.
No seu caso, você conseguiria algo como:
IDisposable x = GetObject("invalid name");
try
{
// etc...
}
finally
{
if(x != null)
{
x.Dispose();
}
}
Você deveria estar bem com isso:
using ((IDisposable)null) { }
Nenhuma exceção jogada aqui.
Nota lateral: não confunda isso com foreach
e IEnumerable
onde uma exceção será lançada.
Sim, antes de descartar a referência, será verificado nulo. Você pode se examinar visualizando seu código no refletor.
Você não terá exceção de referência nula de acordo com minha experiência. Será simplesmente ignorado.