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 IDisposablee, 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