2009-07-10 16 views
6

Leyendo sobre el Dispose pattern, veo la documentación que se refiere repetidamente a "limpiar el código administrado y no administrado". Y en la implementación canónica del método Dispose, veo flujos específicos (dependiendo de si disposing es verdadero o falso) dedicados a la limpieza de objetos administrados versus objetos no administrados.Patrón de eliminación: ¿cómo puedo saber qué se administra y qué no se administra?

¿Pero soy yo, el principiante, para saber qué tipos se administran y cuáles no se administran?

Respuesta

3

La versión corta es: cualquier cosa que también implemente IDisposable necesita ser llamada en su método Dispose. FxCop también le informará si se está perdiendo algo (o no está usando IDisposable en absoluto cuando debería).

+0

Aunque esto realmente no responde la pregunta, ya no estoy convencido de que exista una buena respuesta. Esto proporciona la mejor solución práctica a los problemas que surgen cuando un programador no puede emitir un juicio sobre la "capacidad de gestión" de un tipo, pero creo que un programador que quiere una heurística definitiva para emitir ese juicio simplemente no tiene suerte. –

0

Si no lo sabe, los tipos que está utilizando probablemente se administren.

Los tipos no administrados hacen referencia a los tipos que no son seguros, es decir, que no cumplen con los requisitos de seguridad de CLR.

Great definition linked:

actualización

No entiendo la downvote? La pregunta era específicamente ¿cómo diferenciar entre tipos administrados y no administrados?

Todas las otras respuestas se dirigían a la pregunta IDispose, en lugar de la pregunta administrada/no administrada?

Actualización 2

Todavía no hay explicación de la segunda downvote ...

Estoy de acuerdo, un objeto IDisposable siempre debe ser eliminado, pero eso no responde a la pregunta sobre gestionado vs administrado .

+0

De forma similar a mi otro comentario, ¿cómo sabe * que un tipo, como usted dice, no cumple con los requisitos de seguridad de CLR? Es decir.si tuviera que escribir un plugin de Reflector para informar sobre la "falta de gestión" de un tipo seleccionado, ¿qué inspeccionaría mi plugin en ese tipo para emitir un juicio definitivo? –

0

Simplemente sugiero destruir todos los recursos después de usarlos. Todo lo que generalmente depende de un recurso del sistema, como sockets y recursos de transmisión, que desea liberar explícitamente. En caso de duda, adelante y deseche. Le ahorra muchos problemas de depuración a largo plazo. Por lo general, cuando llamas a un código que no está escrito en .NET puedes asumir que no es un "código administrado".

2

Gestionado o no administrado realmente no importa. Si una clase implementa la interfaz IDisposable, debe llamar a Dispose() cuando haya terminado con el objeto. Alternativamente (preferiblemente) haga uso del using statement para que se llame a Dispose() automáticamente cuando el objeto se salga del alcance.

@ Rob:
La respuesta es siempre la misma. Si su clase gestiona cualquier objeto interno que implemente IDisposable, también debería implementar IDisposable. En su método Dispose(), llame a Dispose en esos objetos.

+0

Creo que la pregunta era formular desde el punto de vista del diseño de ID identificables, es decir, lo que debería y no debería liberarse cuando se desecha frente a la finalización. – Rob

+1

@Thorarin - Creo que el punto que Rob está planteando es que si implementa el patrón clásico de disposición, tiene una bandera IsDisposing para indicar si está desechando debido a una llamada para deshacerse, o debido a la ejecución del finalizador. En este último caso, deberá tener cuidado de no deshacerse de otros objetos administrados, ya que es posible que ya hayan sido recolectados. Activado cuando se llama explícitamente desde un método Dispose(), es seguro disponer de estos. El recurso * no administrado * debe, sin embargo, eliminarse en ambos casos. –

+0

Tiendo hacia el enfoque de la Gestapo en ese caso: si el finalizador se llama en absoluto, se queja en voz alta al programador para arreglar su código. – Thorarin

5

No gestionado significa objetos Win32 nativos, principalmente identificadores; y referencias a objetos COM sin procesar. Estos son recursos que no están bajo el control de (ni administrados por) .NET CLR.

+0

Correcto, pero ¿cómo sería un desarrollador estrictamente.NET demasiado joven para haber usado Win32, COM, etc. * saber * que un recurso no está bajo el control de la CLR, o peor aún, * depende * de un recurso que no está ¿Está bajo el control del CLR? Quiero decir, ¿cómo sabes * que, por ejemplo, no se administra un identificador? Probablemente experiencia. Pero en ausencia de esa experiencia, ¿cómo es que un programador más ecológico puede hacer las cosas bien todas las veces? Yo afirmo que la presencia de, digamos, la interfaz IDisposable no es suficiente; a su programador promedio no se le enseña a verificar la documentación de cada tipo para una mención de IDisposable. –

+1

Digo lo contrario. Si IDisposable está ahí, entonces deseche. Período. De esta manera, el joven tierno nunca debe ser expuesto al trauma de COM. –

Cuestiones relacionadas