Para añadir un poco a la respuesta de Brian, y su comentario/pregunta:
La diferencia entre un recurso gestionado/no administrado es que el recolector de basura es consciente de los recursos gestionados y no tiene conocimiento de los recursos no administrados. Sé que la respuesta no es muy concreta, pero la diferencia es enorme.
Para ayudar a dibujar la línea en la arena aquí es la versión corta (y probablemente plagado de pequeños errores) de cómo se ejecuta GC y se limpia la memoria:
colector
La basura es consciente de todos los objetos gestionados embargo, cuando la basura la colección se ejecuta inicialmente no sabe si un objeto dado todavía está en uso o es elegible para ser lanzado. Determina si puede o no limpiar un objeto marcando inicialmente todos los objetos como basura y luego atravesando desde la raíz de la aplicación hasta todos los objetos a los que se hace referencia. Cada objeto que tiene una relación con la raíz (una referencia, ya sea directa o indirecta) se marca como alcanzable y ya no se considera basura. Después de que el GC recorre todos los objetos alcanzables, limpia el resto ya que no están en uso.
En casi todos los casos que trabaje con objetos de .NET Framework, puede estar seguro de que los objetos se administran (.NET proporciona envoltorios administrados de casi todos los recursos no administrados para garantizar que se limpien adecuadamente); otros componentes de terceros que se conectan a la API de Win32 (o sus componentes que hacen esto) son los objetos que pueden ser motivo de preocupación.
Hay algunos objetos .NET que se pueden considerar algo no administrados. Los componentes de la biblioteca de gráficos son un ejemplo.
La mayoría de las "Fugas de memoria .NET" no son realmente fugas de memoria en el verdadero sentido. Normalmente ocurren cuando piensa que ha eliminado un objeto del uso, pero de hecho el objeto todavía tiene alguna referencia a la aplicación. Un ejemplo común es agregar eventhandlers (obj.SomeEvent + = OnSomeEvent -o bien - AddHandler obj.SomeEvent, AddressOf OnSomeEvent) y no eliminarlos.
Estas 'referencias persistentes' técnicamente no son pérdidas de memoria ya que su aplicación todavía las está utilizando técnicamente; sin embargo, si hay suficientes, su aplicación puede sufrir graves impactos en el rendimiento y puede mostrar signos de problemas de recursos (OutOfMemoryExceptions, no se pueden obtener identificadores de ventanas, etc.).
Soy un desarrollador intermedio de .NET y desafortunadamente conozco estos problemas de primera mano. Recomiendo jugar con ANTS Profiler para familiarizarse con las referencias persistentes (hay una versión de prueba gratuita) o si quieres obtener un poco más de investigación con WinDbg y SOS.DLL para ver el montón administrado. Si decides ver lo último, te recomiendo leer el blog de Tess Ferrandez; tiene una gran cantidad de excelentes tutoriales y consejos sobre el uso eficaz de Windb.
Así que es un tipo administrado que no implementa IDisposable un recurso no administrado? Tal vez estoy confundido por el recurso tipo versos ... –
@Yooder: ¿Cómo se puede tener un recurso administrado que no está representado por un tipo? –
@LarryFix: Diferentes personas usan la terminología de manera diferente, pero yo diría que un objeto que no ha pedido * otra cosa * que haga algo en su nombre, hasta nuevo aviso, y en detrimento de otros, no contiene * ningún * recursos. – supercat