pattern - ¿Qué se entiende por recursos "administrados" vs "no administrados" en.NET?
.net idisposable pattern (5)
El término "recurso no gestionado" generalmente se usa 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.net en la máquina cliente, si el proveedor no está escrito enteramente en código administrado.
Por esta razón, 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 se llama .Dispose()
al objeto de conexión, asegurando que todos los recursos no administrados se limpien.
¿Qué se entiende por los términos recurso gestionado y recurso no gestionado en .NET? ¿Cómo entran en la imagen?
En las preguntas y respuestas ¿Qué son recursos no administrados? 1 , Bruce Wood publicó lo siguiente:
Pienso en los términos "administrado" y "no gestionado" de esta manera:
"Gestionado" se refiere a cualquier cosa dentro del entorno limitado .NET. Esto incluye todas las clases de .NET Framework.
"No administrado" se refiere a la naturaleza fuera del entorno limitado de .NET. Esto incluye todo lo que se le devuelve mediante llamadas a las funciones API de Win32.
Si nunca llama a una función de API de Win32 y nunca recupera ningún objeto de "control" de Win32, entonces no tendrá ningún recurso no administrado. Los archivos y las secuencias que se abren a través de los métodos de clase de .NET Framework son todos los contenedores administrados.
Comentario: Es posible que no tenga un recurso no administrado directamente . Sin embargo, puede estar reteniendo indirectamente un recurso no gestionado a través de una "clase contenedora" administrada como System.IO.FileStream . Tal clase de envoltura comúnmente implementa IDisposable (ya sea directamente o por herencia).
... muchos objetos administrados (.NET Framework) retienen recursos no administrados dentro de ellos, y es probable que desee Dispose () de ellos tan pronto como sea posible, o al menos ofrezca a sus interlocutores la oportunidad de hacerlo. Ahí es donde entra la escritura de su propio método Dispose (). Básicamente, la implementación de IDisposable () hace dos cosas por usted:
Le permite deshacerse de cualquier recurso que haya obtenido directamente del sistema operativo detrás de .NET (recursos no administrados).
Te permite a ti y a tus interlocutores liberar objetos .NET / objetos .NET pesados que tienen valiosos recursos en sus manitas mugrientas que tú / tus interlocutores quieren que se liberen ahora .
Comentario: Al implementar IDisposable
y, por lo tanto, proporcionar un método Dispose()
, está permitiendo que un usuario de su clase libere de manera determinista todos los recursos no administrados que una clase posea en su clase.
1 Enlace originalmente compartido en la respuesta de Sachin Shanbhag . Material citado con fecha 2005-11-17. Tenga en cuenta que he copiado 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 punto en el tiempo el GC vendrá y limpiará toda la memoria y los recursos asociados con un objeto administrado. El GC no tiene conocimiento de recursos no administrados, como archivos, rutas y controladores, por lo que si no los limpia de forma explícita en el código, terminará con pérdidas de memoria y recursos bloqueados.
Para más detalles, http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources
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 fija, objetos COM, conexiones de bases de datos, etc.
Los recursos gestionados son recursos que pueden ser liberados por el recolector de elementos no utilizados y los recursos no administrados no pueden ser liberados por el recolector de basura para este propósito. Se requiere el destructor.