¿Qué se entiende por los términos recurso administrado y recurso no administrado en .NET? ¿Cómo entran en escena?
¿Qué se entiende por los términos recurso administrado y recurso no administrado en .NET? ¿Cómo entran en escena?
Respuestas:
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.
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.
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:
Le permite deshacerse de cualquier recurso que haya obtenido directamente del sistema operativo a espaldas de .NET (recursos no administrados).
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 IDisposable
y, 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.
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