2009-10-30 18 views
7

¿Cuál es la diferencia entre los dos fragmentos de código:¿Diferencia entre 'usar' y el alcance?

using (Object o = new Object()) 
{ 
    // Do something 
} 

y

{ 
    Object o = new Object(); 
    // Do something 
} 

he empezado a utilizar using mucho más, pero estoy curioso en cuanto a lo que los beneficia realmente son, en comparación para examinar objetos

Editar: cositas útiles que hice de esta:

Jon Skeet:

Tenga en cuenta que esto no forzar la recolección de basura de cualquier manera o forma. La recolección de basura y la pronta limpieza de recursos son algo ortogonales.

Will Eddins comentario:

A menos que su clase implementa la interfaz IDisposable, y tiene una función Dispose(), no se utiliza el uso.

Respuesta

20

El primer fragmento llama Dispose al final del bloque - sólo se puede hacerlo con tipos que implementan IDisposable, y llama básicamente Dispose en un bloque finally, por lo que se puede utilizar con los tipos que necesitan limpieza recursos arriba, por ejemplo

using (TextReader reader = File.OpenText("test.txt")) 
{ 
    // Use reader to read the file 
} 
// reader will be disposed, so file handle released 

en cuenta que esto no recogida de basura vigor de cualquier manera o forma. La recolección de basura y la pronta limpieza de recursos son algo ortogonales.

Básicamente, debe utilizar una declaración using para casi cualquier cosa que implemente IDisposable y de la cual se responsabilizará su bloque de código (en términos de limpieza).

+0

¿Es justo decir que esto es principalmente aplicable cuando necesita limpiar recursos no administrados que su clase podría contener? ¿O se aplica también a clases puramente administradas? –

+0

+1 para la nota con respecto a la recolección de basura, siempre tengo una tendencia a olvidarlo ... – jdehaan

+0

Ok, un objeto típico utilizado para almacenar una estructura de datos no vería ningún beneficio de la cláusula de uso sino un objeto más pesado que implementa IDisposable sería? – Kelsey

3

Al final de using el objeto se desecha (el objeto que coloca entre paréntesis debe implementar IDisposable). El objeto se elimina también en casos de excepción. Y no tiene que esperar que el GC lo haga en algún momento (lo controla).

EDIT: La desventaja del alcance son:

  • que no controlan la disposición del objeto
  • incluso si usted llamaría disponer al final de su alcance, no estaría a salvo excepción
1

Consulte la documentación referente a IDisposable y la desasignación de recurso determinable.

En pocas palabras, al final del bloque using{}, puede fiable disponer de los recursos asignados (por ejemplo, identificadores de archivo cercanos, conexiones de bases de datos, etc.)

0

using solo requiere una implementación de la interfaz IDisposable y llama al método Dispose al final del alcance.

Para tener muchas discusiones sobre cómo deshacerse de los objetos correctamente, hay muchos otros hilos.

3

sólo para mostrar literalmente la diferencia ...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate)) 
{ 
    //stuff with file stream 
} 

es lo mismo que ...

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 

    try 
    { 
    //stuff with filestream 
    } 
    finally 
    { 
    if (fileStream != null) 
     ((IDisposable)fileStream).Dispose(); 
    } 
} 

donde como

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 
    fileStream.Dispose(); 
} 

es como es.

+0

+1 para un buen ejemplo. – Kelsey

Cuestiones relacionadas