O que significa recursos “gerenciados” versus recursos “não gerenciados” no .NET?

Respostas:

80

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.

Roubar
fonte
20
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.

Oded
fonte
13

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ê:

  1. Permite que você se livre de quaisquer recursos obtidos diretamente do sistema operacional pelas costas do .NET (recursos não gerenciados).

  2. 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.

DavidRR
fonte
5

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

Sachin Shanbhag
fonte
1
"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.

anil
fonte