Pregunta

Sé que hay un número de hilos por aquí acerca de cómo utilizar la instrucción y llamar al método Dispose ().He leído la mayoría de estos hilos.

Si puedo llamar a Dispose(), hace llamar a Close()?

Si quiero usar un objeto (digamos SqlDataReader), pero, a continuación, volver a usar en otro bloque de código, no debo llamar a Dispose()?Lo que también significa omitir la instrucción de uso.

También, para aclarar, si un FileStream es envolver un StreamWriter y puedo llamar a dispose en el FileStream, esto llamará a Flush(), Close() y Dispose() (dependiendo de si Dispose() llama a Close()) en el StreamWriter, ¿verdad?Del mismo modo, si yo llamo a Cerrar en el FileStream, esto sólo va a llamar a Flush() y Close() en el objeto FileStream.

Es la comprobación de IL una buena manera de responder a estas preguntas acerca de lo que está sucediendo bajo el capó?

¿Fue útil?

Solución

  

Si llamo a Dispose (), ¿se llama Close ()?

Dispose debe tomar cualquier acciones necesarias para disponer de los recursos, que debe ser similar, si no idéntica, a llamar Close . Esto, sin embargo, es un detalle de implementación y no necesariamente garantiza (aunque podemos esperar que el BCL siga esa línea).

  

Si quiero usar un objeto (digamos SqlDataReader), pero luego utilizarlo de nuevo en otro bloque de código, no debería llamar a Dispose ()? Que también significa omitir la instrucción using.

Si desea utilizar de nuevo el objeto, que definitivamente no debe deshacerse de él. Sin embargo, se debe utilizar normalmente dos conexiones independientes si vas a la base de datos dos veces por separado. Por lo general no es una buena idea mantener un IDataReader alrededor de un largo que se necesita para tomar los datos necesarios.

  

Además, para aclarar, si un FileStream está terminando un StreamWriter y pido disponer en el FileStream, esto va a llamar a flush (), Close () y botar () (dependiendo de si Dispose () llama a Close ()) en el StreamWriter, ¿verdad? Del mismo modo, si llamo Cerrar en el FileStream, esto sólo llamar a flush () y Cerrar () en el FileStream.

disponer un objeto que envuelve otro objeto desechable debe llamar FileStream en el objeto interior. Llamando <=> en un <=> llamará a su método <=> bajo la buena, por lo que también actuará en ambas corrientes.

  

es el control de IL una buena manera de responder a estas preguntas acerca de lo que está sucediendo bajo el capó?

Comprobación de IL definitivamente responder a la mayoría de estas preguntas definitivamente. Como @Rich dice, también puede simplemente tratar depurar sus propias implementaciones Desechar. También hay, por supuesto, la documentación de MSDN para empezar antes de intentar resolverlo por su cuenta, y el reflector si no desea lodo alrededor de la IL.

Otros consejos

"Si llamo a Dispose (), ¿se llama Close ()?"

En teoría, debería. Las clases de BCL todos hacen esto, pero es decisión del autor biblioteca para manejar correctamente esto. Si la biblioteca está utilizando se hace correctamente, Dispose () debe también Close () [y cerrar () dispondrá () - las llamadas deben ser intercambiables].

"Si quiero usar un objeto (digamos SqlDataReader), pero luego utilizarlo de nuevo en otro bloque de código, ¿no debería llamar a Dispose ()? ¿Qué significa también omitir la instrucción using."

correcta. Si utiliza la instrucción using, siempre va a llamar a Dispose (). Esto cerrará el lector de datos antes de que su otro bloque puede utilizarlo.

"Además, para aclarar, si un FileStream está terminando un StreamWriter y pido disponer en el FileStream, esto va a llamar a flush (), Close () y eliminar () (dependiendo de si Dispose () llama a Close ()) en el StreamWriter, ¿verdad? del mismo modo, si llamo Cerrar en el FileStream, esto sólo llamar a flush () y Cerrar () en el FileStream. "

Si está envolviendo un FileStream en torno a un StreamWriter, le recomiendo tratar de forma coherente. Use un solo uso de declaración con ambos miembros, de modo que ambos están dispuestos de al final del bloque. Este es el enfoque más limpia más segura.

"es el control de IL una buena manera de responder a estas preguntas acerca de lo que está sucediendo bajo el capó?"

Es una manera - aunque de una manera más difícil. Leer en MSDN sobre el uso y arroyos, así como la documentación explicará en términos más simples de tratar de analizar la IL. La IL le dirá exactamente lo que ocurre, sin embargo, si usted es curioso.

  

Si llamo a Dispose (), ¿se llama Close ()?

Close () y botar () hacer lo mismo si se aplica correctamente; es sólo una cosa de nombres. Suena más sencillo cerrar un archivo que de deshacerse de él. Ver de Ejecución finalizar y Dispose para limpiar los recursos no administrados especialmente si se trata 'Personalización de una desechar el Nombre de método'.

  

Si quiero usar un objeto (digamos SqlDataReader), pero luego usarlo de nuevo en otro código #   bloque, no debería llamar a Dispose ()? Que también significa omitir la instrucción using.

Sí, porque el objeto se dispone en la salida de la bloque usando.

  

Además, para aclarar, si un FileStream está terminando un StreamWriter y pido disponer en la> FileStream, esto va a llamar a flush (), Close () y botar () (dependiendo de si Dispos ()   llama a Close ()) en el StreamWriter, ¿verdad? Del mismo modo, si llamo Cerrar en el FileStream,> esto sólo llamar a flush () y Cerrar () en el FileStream.

Es a la inversa; un StreamWriter se basa en una secuencia subyacente de un cierre de la StreamWriter cierra la secuencia subyacente que puede ser un FileStream; ver la MSDN para referencia. Por lo tanto el uso de una sola declaración para la StreamWriter es sufficent.

  
    

Si llamo a Dispose (), ¿se llama Close ()?

  

No necesariamente. A veces uso del reflector para comprobar lo que realmente sucede en Cerrar y Eliminar.

  
    

Si quiero usar (...) de nuevo en otro bloque de código, no debería llamar a Dispose ()?

  

correcta. Llamar a Dispose cuando haya terminado. Pero que no quiere decir que siempre desea mantener su Objeto vivo durante mucho tiempo - a veces puede beneficiarse de la creación de múltiples instancias (using múltiples construcciones) - por ejemplo, Es posible que wan para cerrar una conexión tan pronto como sea posible, pero a continuación, crear un nuevo otra vez cuando lo necesite.

Como usted ha dicho, hay gran cantidad de recursos en eso, sino que incluirán el enlace de MSDN para algunas pautas: Implementación de finalizar y Dispose para limpiar no administrado Recursos .

Deseche el principal método es la vinculada a la interfaz IDisposable y los Desechables patrón.

Microsoft llama a un método como Close() un Específico De Dominio De Alias, y que da la idea.Pero es todavía hasta el Implementador de la Clase, podría haber diferencias, como ser capaz de abrir o no.Pero en general usted no debe (tener) cuidado.

El sqlDataReader es un poco de un mal ejemplo porque no se puede la reutilización de la misma.Y que, en general, el mejor consejo para todos los demás objetos Desechables demasiado.

Una forma más fácil de depurar este de pasar por el código IL sería derivar de su IDisposable, anular los métodos necesarios que hacen nada más que llamar base.[Method Name](), y establecer un punto de interrupción en cada uno. Entonces, si usted envuelve su clase derivada en un bloque usando, verá el ciclo de vida de estas llamadas.

No, IDisposable no requiere Close (), pero el objeto que implementa IDispose puede ser lo suficientemente bueno para incluirlo en el método Dispose ().

Usted debe deshacerse de él tan pronto como tenga el dato que está recibiendo de la DB. No dejar un lector de abrir por más tiempo de lo necesario. Si usted está haciendo cualquier real trabajo con los datos, utilice un adaptador de datos / base de datos en lugar del lector.

No Idea. Compruebe la generada IL

Trato de mover el uso de la cláusula más arriba, ya que prefiero utilizar esa sintaxis. A continuación, llamar a los otros bloques utilizando ese recurso desde el interior que el uso de bloque.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top