entiendo la confusión. Creo que hay algunas pautas simples a seguir:
Si su clase "posee" una referencia a otro objeto (es decir, el objeto creado por otro objeto, o se le dio la referencia a ese objeto con el entendimiento de que su objeto ahora "lo posee"), entonces usted es responsable de hacer cualquier limpieza necesaria (si la hay)
Si ese otro objeto es un objeto .NET y no implementa la interfaz IDisposable, entonces probablemente no lo haga Necesito hacer cualquier cosa. La interfaz IDisposable es, por convención, la interfaz que utilizamos para declarar si nuestros objetos requieren o no limpieza.
Si ese otro objeto es un objeto .NET e implementa la interfaz IDisposable, entonces su clase también debería implementar la interfaz IDisposable. En su método Dispose, simplemente llame al método Dispose del otro objeto.
Si ese otro objeto es un recurso o un recurso no administrado, su clase debería implementar un finalizador para asegurarse de que el objeto/recurso no administrado se limpiará. Siga las pautas descritas en esa publicación de blog para saber cómo implementar eso.
A continuación se presentan algunas respuestas específicas a sus preguntas.
- En algún momento, .NET es simplemente envolviendo llamadas de Win32, ¿verdad? Entonces, ¿no son la mayoría de los objetos .NET de alguna manera un recurso no administrado?
A pesar de que un objeto .NET puede envolver llamadas de Win32, el término "recurso no administrado" no es adecuado, ya que es un objeto .NET, por lo tanto, es por definición un "recurso administrado". El CLR maneja la asignación de memoria y la recolección de basura para esos objetos.
- ¿Qué pasa con los objetos COM que tenemos envolturas para .NET - ¿Qué son considerados?
objetos .NET envoltura siguen siendo objetos .NET, por lo que son "recursos gestionados", pero tenga en cuenta que deben poner en práctica su propia disponer/finalizar la lógica. Básicamente, se encargan de limpiar los "recursos no administrados" para que usted no tenga que hacerlo. Si estuviera implementando su propio contenedor para un objeto COM, entonces sería responsable de implementar la lógica de disposición/finalización necesaria para limpiarlo, de modo que los consumidores de su contenedor no tengan que hacerlo.
- ¿Qué pasa con las clases administradas que se interponen funcionalidad exclusivamente de P/Invoca?
Una clase que utiliza P/Invoke para llamar al código no administrado podría estar asignando recursos no administrados, dependiendo de lo que se está llamando a administrar.Por lo tanto, puede ser necesario implementar la lógica de disposición/finalización necesaria para limpiar esos recursos no administrados.
- ¿Qué hay de clases de C++/CLI que utilizan internamente bibliotecas nativas?
Sí, los que también se pueden asignar los recursos no administrados de las bibliotecas nativas, por lo que también sería necesario que implementan la lógica destructor/finalizador necesario.
- En el nivel C#, las clases C++/CLI que tenían destructores ahora implementan IDisposable ... lo que se considera?
En C++/CLI, se puede optar por declarar una clase que sea administrado (con la palabra clave ref) o no administrados (sin la palabra clave ref). Si se declara con la palabra clave ref, entonces es una clase administrada; se asignará en el montón administrado y será limpiado por el recolector de basura una vez que se salga del alcance y no haya más referencias al mismo. Si la clase se declara sin la palabra clave ref, no se administra y debe limpiarse explícitamente. En cualquier caso, la clase podría haber asignado recursos no gestionados que deben limpiarse en el destructor/finalizador.
* "Si hay una forma más nueva de abordar este problema ..." * ¿Cuál es exactamente el problema aquí? –
Administrar el ciclo de vida de los objetos administrados y no administrados. Si hace esto en el orden incorrecto, puede tener interbloqueos – jglouie
¿Qué hay de malo en el ejemplo dado en [la documentación] (http://msdn.microsoft.com/library/System.IDisposable.aspx)? –