O que significam os termos recurso gerenciado e recurso não gerenciado no .NET? Como eles entram em cena?
O que significam os termos recurso gerenciado e recurso não gerenciado no .NET? Como eles entram em cena?
Respostas:
O termo "recurso não gerenciado" geralmente é usado para descrever algo que não está diretamente sob o controle do coletor de lixo . Por exemplo, se você abrir uma conexão com um servidor de banco de dados, isso usará recursos no servidor (para manter a conexão) e possivelmente outros recursos não -.net na máquina cliente, se o provedor não for escrito inteiramente em código gerenciado.
É por isso que, para algo como uma conexão de banco de dados, é recomendável que você escreva seu código da seguinte maneira:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Isso garante que .Dispose()
seja chamado no objeto de conexão, garantindo que todos os recursos não gerenciados sejam limpos.
No Q&A O que são recursos não gerenciados? 1 , Bruce Wood postou o seguinte:
Eu penso nos termos "gerenciado" e "não gerenciado" desta forma:
"Gerenciado" refere-se a qualquer coisa dentro da sandbox .NET. Isso inclui todas as classes do .NET Framework.
"Não gerenciado" refere-se ao ambiente selvagem fora da sandbox do .NET. Isso inclui tudo o que é retornado a você por meio de chamadas para funções da API do Win32.
Se você nunca chamar uma função da API do Win32 e nunca receber de volta nenhum objeto "identificador" do Win32, então você não está mantendo nenhum recurso não gerenciado. Arquivos e fluxos abertos por meio dos métodos de classe do .NET Framework são todos wrappers gerenciados.
Comentário: Você pode não estar mantendo um recurso não gerenciado diretamente . No entanto, você pode estar mantendo um recurso não gerenciado indiretamente por meio de uma "classe de wrapper" gerenciada, como System.IO.FileStream . Essa classe de wrapper comumente implementa IDisposable (diretamente ou por meio de herança).
... muitos objetos gerenciados (.NET Framework) estão mantendo recursos não gerenciados dentro deles e você provavelmente deseja Dispose () deles assim que puder, ou pelo menos oferecer aos chamadores a oportunidade de fazer isso. É aí que entra a escrita de seu próprio método Dispose (). Essencialmente, implementar IDisposable () faz duas coisas para você:
Permite que você se livre de quaisquer recursos obtidos diretamente do sistema operacional pelas costas do .NET (recursos não gerenciados).
Permite que você e seus chamadores liberem objetos .NET / objetos .NET pesados que contêm recursos preciosos em suas mãozinhas sujas que você / seus chamadores desejam liberar agora .
Comentário: Ao implementar IDisposable
e, portanto, fornecer um Dispose()
método, você permite que um usuário de sua classe libere de forma determinística quaisquer recursos não gerenciados mantidos por uma instância de sua classe.
1 Link originalmente compartilhado na resposta de Sachin Shanbhag . Material citado datado de 2005-11-17. Observe que fiz uma pequena edição do conteúdo citado.
A diferença básica entre um recurso gerenciado e não gerenciado é que o coletor de lixo sabe sobre todos os recursos gerenciados, em algum ponto no tempo o GC aparecerá e limpará toda a memória e recursos associados a um objeto gerenciado. O GC não sabe sobre recursos não gerenciados, como arquivos, fluxo e identificadores, portanto, se você não os limpar explicitamente em seu código, você acabará com vazamentos de memória e recursos bloqueados.
Para mais detalhes - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources