¿Qué se entiende por recursos “administrados” frente a recursos “no administrados” en .NET?

Respuestas:

80

El término "recurso no administrado" se usa generalmente para describir algo que no está directamente bajo el control del recolector de basura . Por ejemplo, si abre una conexión a un servidor de base de datos, esto usará recursos en el servidor (para mantener la conexión) y posiblemente otros recursos que no sean de.net en la máquina cliente, si el proveedor no está escrito completamente en código administrado.

Es por eso que, para algo como una conexión de base de datos, se recomienda que escriba su código de la siguiente manera:

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

Como esto asegura que .Dispose()se invoca en el objeto de conexión, asegurando que se limpien los recursos no administrados.

Robar
fuente
20
Lo aclararía un poco: un "recurso no administrado" es algo que el recolector de basura no sabrá cómo limpiar si se abandona. La suscripción de un objeto de corta duración a un evento de un objeto de larga duración, por ejemplo, sería un recurso no administrado aunque ambos objetos estén bajo el control del recolector de basura, ya que el GC no tendrá forma de saber que la suscripción debe descartarse si se abandona el suscriptor pero no el editor. Si se pudiera crear y abandonar un número ilimitado de suscriptores durante la vida del editor, se produciría una pérdida de memoria.
supercat
12
Agregando un poco más de aclaración: SqlConnection (o FileStream, etc.) son recursos administrados que utilizan internamente recursos no administrados que GC desconoce.
jimvfr
2
jimvfr tiene razón, SqlConnection es un ejemplo de recursos administrados. Un ejemplo de recursos no administrados es cuando necesitamos asignar memoria desde la memoria no administrada usando el método Marshal.AllocHGlobal () es un recurso no administrado en este caso, la mejor práctica es usar un destructor (~ ctor) y llamar al Marshal.FreeHGlobal () para liberar este recuerdo.
Ygor Thomaz
¿Puede dar un ejemplo de recursos administrados y no administrados?
Radha Manohar
32

Los recursos administrados son aquellos que son código .NET puro y administrados por el tiempo de ejecución y están bajo su control directo.

Los recursos no administrados son aquellos que no lo son. Manejadores de archivos, memoria anclada, objetos COM, conexiones de bases de datos, etc.

Oded
fuente
13

En las preguntas y respuestas ¿Qué son los recursos no administrados? 1 , Bruce Wood publicó lo siguiente:

Pienso en los términos "administrado" y "no administrado" de esta manera:

"Administrado" se refiere a cualquier cosa dentro del entorno limitado de .NET. Esto incluye todas las clases de .NET Framework.

"No administrado" se refiere a la naturaleza fuera de la zona de pruebas de .NET. Esto incluye todo lo que se le devuelva a través de llamadas a las funciones de la API de Win32.

Si nunca llama a una función de la API de Win32 y nunca recupera ningún objeto "identificador" de Win32, entonces no tiene ningún recurso no administrado. Los archivos y secuencias que abre a través de los métodos de clase de .NET Framework son contenedores administrados.

Comentario: es posible que no tenga un recurso no administrado directamente . Sin embargo, es posible que tenga un recurso no administrado indirectamente a través de una "clase contenedora" administrada como System.IO.FileStream . Dicha clase contenedora comúnmente implementa IDisposable (ya sea directamente o por herencia).

... muchos objetos administrados (.NET Framework) contienen recursos no administrados dentro de ellos, y probablemente desee Dispose () de ellos tan pronto como pueda, o al menos ofrecer a sus llamantes la oportunidad de hacerlo. Ahí es donde entra en juego escribir su propio método Dispose (). Esencialmente, implementar IDisposable () hace dos cosas por usted:

  1. Le permite deshacerse de cualquier recurso que haya obtenido directamente del sistema operativo a espaldas de .NET (recursos no administrados).

  2. Le permite a usted y a las personas que llaman liberar objetos pesados ​​.NET / objetos .NET que tienen recursos valiosos en sus manitas sucias y que usted o sus personas que llaman quieren que se liberen ahora .

Comentario: Al implementar IDisposabley, por lo tanto, proporcionar un Dispose()método, está permitiendo que un usuario de su clase libere de manera determinista cualquier recurso no administrado que se encuentre en una instancia de su clase.


1 Enlace originalmente compartido en la respuesta de Sachin Shanbhag . Material citado con fecha 2005-11-17. Tenga en cuenta que he editado ligeramente el contenido citado.

DavidRR
fuente
5

La diferencia básica entre un recurso administrado y no administrado es que el recolector de basura conoce todos los recursos administrados; en algún momento, el GC aparecerá y limpiará toda la memoria y los recursos asociados con un objeto administrado. El GC no conoce los recursos no administrados, como archivos, transmisiones y controladores, por lo que si no los limpia explícitamente en su código, terminará con pérdidas de memoria y recursos bloqueados.

Para obtener más detalles: http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

Sachin Shanbhag
fuente
1
"La idea detrás de la interfaz IDisposable es permitirle limpiar los recursos de una manera determinista y limpiar los recursos no administrados". ¡Genial!
zionpi
0

Los recursos administrados son recursos que pueden ser liberados por el recolector de basura y los recursos no administrados no pueden ser liberados por el recolector de basura para este propósito se requiere el destructor.

añil
fuente