Try/Finally ou Using ???
Olá pessoal,
Vocês sabem qual a diferença entre Try/Finally e Using ?
( )Não ( )Sim ( )Talvez ( )Try/Finally o que é isso(..rs..)
Vamos a explicação, a diferença é quase nenhuma todos os dois comandos fazem no final das contas o mesmo trabalho.
Só pra relembrar o Try/Finally gera um bloco no qual o seu código sempre vai ser executado, tendo seu código anterior sucesso ou não. Normalmente usamos um Try/Finally para liberar recursos alocados nas linhas que estão dentro o bloco Try, ou para algum tipo de validação incondicional, isso que dizer, que sempre vai passar por ali.
O “Using” atende mais ao primeiro tipo de utilização, a liberação de recursos. O objeto que foi instânciado no comando “Using“, simplesmente ao sair do escopo vai ser automaticamente liberado, ou seja, vai ser feito uma chamada ao “Dispose” deste objeto de forma totalmente automática.
Este comando na verdade é um tipo de atalho da linguagem que no final, quando o compilador gera o seu assembly em IL, o comando é traduzindo para uma instrução bem semelhante a instrução nativa do Try/Finally.
Aqui uma parte de código em IL da instrução “Using“:
…
L_0028: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_002f: endfinally
.try L_0003 to L_001e finally handler L_001e to L_0030
…
As instruções acima são praticamente as mesmas quando você usa um “Try/Finally“, o que muda é a forma de chamar o “Dispose” do objeto.
Mas para utilizar o “Using” temos de lembrar do seu pré-requisito, o objeto que vai ser instânciado deve implementar a interface “IDisposable“.
Na pratica como funciona, vejamos um exemplo simples:
1- Aqui um código puro sem bloco de segurança.
TextWriter writer = new StreamWriter(”texto.txt”);
writer.WriteLine(”Aqui vem o texto.”);
writer.Dispose();
2- Agora o mesmo código, só que em uma construção dentro de um bloco seguro e com a liberação do recurso do objeto.
TextWriter writer1 = null;
try
{
writer1 = new StreamWriter(”texto.txt”);
writer1.WriteLine(”Aqui vem o texto.”);
}
finally
{
if (writer1 != null)
writer1.Dispose();
}
3- Aqui o equivalente ao código anterior com o comando “using”.
using ( TextWriter writer2 = new StreamWriter(”texto.txt”) )
{
writer2.WriteLine(”Aqui vem o texto.”);
}
4- Aqui só pra exemplo, como o código séria em IL utilizando o comando “using”.
TextWriter writer3 = null;
try
{
writer3 = new StreamWriter(” texto.txt”);
writer3.WriteLine(”Aqui vem o texto.”);
}
finally
{
if(writer3 != null)
((IDisposable) writer3).Dispose();
}
Bem fica ai a dica… lembrem de usar o “using” sempre que estiverem trabalhando com recursos não gerenciados.
Ps: No c# também temos o “using” para importar os namespaces que vamos fazer referência na classe.
Até mais….
Permalink Enviar por e-mail. Hits para esta publicação: 577.
BrunoKenj disse,
8 de Fevereiro de 2007 @ 12:05
Bacana o código IL, heh. Using DataReader… de lei.
Wellington disse,
9 de Fevereiro de 2007 @ 09:20
Fera … bom saber
Valeu mestre !
Lucas Campos disse,
25 de Fevereiro de 2007 @ 02:47
Muito bom Michael!
Abraços…