Algo como:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Eu acredito que não é um lugar apropriado para uma declaração de retorno, é?
Algo como:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Eu acredito que não é um lugar apropriado para uma declaração de retorno, é?
Como vários outros apontaram em geral, isso não é um problema.
O único caso que causará problemas é se você retornar no meio de uma instrução using e adicionalmente retornar a variável using. Mas, novamente, isso também causaria problemas, mesmo que você não voltasse e simplesmente mantivesse uma referência a uma variável.
using ( var x = new Something() ) {
// not a good idea
return x;
}
Tão ruim
Something y;
using ( var x = new Something() ) {
y = x;
}
return
instrução torna o fim dousing
bloco inacessível por qualquer caminho de código. O final dousing
bloco precisa ser executado para que o objeto possa ser descartado, se necessário.Está perfeitamente bem.
Você aparentemente está pensando que
é traduzido cegamente para:
O que, reconhecidamente, seria um problema e tornaria a
using
afirmação inútil - e é por isso que não é isso que ela faz.O compilador garante que o objeto seja descartado antes do controle sair do bloco - independentemente de como ele sai do bloco.
fonte
É absolutamente bom - não há problema algum. Por que você acredita que está errado?
Uma declaração de uso é apenas açúcar sintático para um bloco try / finalmente, e como Grzenio diz que é bom retornar também de um bloco try.
A expressão de retorno será avaliada, o bloco final será executado e o método retornará.
fonte
Isso funcionará perfeitamente bem, assim como retornar no meio da
try{}finally{}
fonte
Isso é totalmente aceitável. A usando instrução garante que o objeto IDisposable seja descartado, não importa o quê.
Do MSDN :
fonte
O código abaixo mostra como
using
está funcionando:Resultado:
Os descartados são chamados após a declaração de retorno, mas antes da saída da função.
fonte
Talvez não seja 100% verdade que isso seja aceitável ...
Se você estiver aninhando usos e retornando de dentro de um aninhado, talvez não seja seguro.
Tome isso como um exemplo:
Eu estava passando em um DataTable para ser produzido como CSV. Com o retorno no meio, ele estava gravando todas as linhas no fluxo, mas o csv emitido estava sempre faltando uma linha (ou várias, dependendo do tamanho do buffer). Isso me disse que algo não estava sendo fechado corretamente.
A maneira correta é garantir que todas as utilizações anteriores sejam descartadas corretamente:
fonte