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 =newSqlConnection("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.
Eu esclareceria um pouco: um "recurso não gerenciado" é algo que o coletor de lixo não saberá como limpar depois, se for abandonado. A assinatura de um objeto de curta duração para um evento de um objeto de longa duração, por exemplo, seria um recurso não gerenciado, mesmo que ambos os objetos estejam sob o controle do coletor de lixo, uma vez que o GC não terá como saber que a assinatura deve ser descartado se o assinante for abandonado, mas o editor não. Se um número ilimitado de assinantes pudesse ser criado e abandonado durante a vida do editor, isso causaria um vazamento de memória.
supercat
12
Adicionando um pouco mais de esclarecimento: SqlConnection (ou FileStream, etc) são recursos gerenciados que usam internamente recursos não gerenciados que o GC desconhece.
jimvfr
2
jimvfr está certo, SqlConnection é um exemplo de recursos gerenciados. Um exemplo de recursos não gerenciados é quando precisamos alocar memória da memória não gerenciada usando o método Marshal.AllocHGlobal () é um recurso não gerenciado neste caso a prática recomendada é usar um destruidor (~ ctor) e chamar o Marshal.FreeHGlobal () para liberar essa memória.
Ygor Thomaz
você pode dar um exemplo para recursos gerenciados e não gerenciados.
Radha Manohar
32
Recursos gerenciados são aqueles que são código .NET puro e gerenciados pelo tempo de execução e estão sob seu controle direto.
Recursos não gerenciados são aqueles que não são. Identificadores de arquivo, memória fixada, objetos COM, conexões de banco de dados, etc.
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.
"A ideia por trás da interface IDisposable é permitir que você limpe recursos de uma forma determinística e recursos não gerenciados." Incrível!
zionpi
0
Recursos gerenciados são recursos que podem ser liberados pelo coletor de lixo e recursos não gerenciados não podem ser liberados pelo coletor de lixo para este propósito o destruidor é necessário.
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:
Isso garante que
.Dispose()
seja chamado no objeto de conexão, garantindo que todos os recursos não gerenciados sejam limpos.fonte
Recursos gerenciados são aqueles que são código .NET puro e gerenciados pelo tempo de execução e estão sob seu controle direto.
Recursos não gerenciados são aqueles que não são. Identificadores de arquivo, memória fixada, objetos COM, conexões de banco de dados, etc.
fonte
No Q&A O que são recursos não gerenciados? 1 , Bruce Wood postou o seguinte:
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).
Comentário: Ao implementar
IDisposable
e, portanto, fornecer umDispose()
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.
fonte
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
fonte
Recursos gerenciados são recursos que podem ser liberados pelo coletor de lixo e recursos não gerenciados não podem ser liberados pelo coletor de lixo para este propósito o destruidor é necessário.
fonte