2010-06-22 8 views
5
using (Font font3 = new Font("Arial", 10.0f), 
      font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

Sé que se pueden usar múltiples objetos del mismo tipo dentro de un usando la cláusula.¿Puedo tener diferentes tipos de objetos en un C# * usando * bloque?

¿Puedo usar diferentes tipos de objetos dentro de la usando la cláusula?

Bueno Lo intenté, pero aunque eran diferentes nombres y diferentes objetos, que actuaron las mismas = tenían el mismo conjunto de métodos

¿Hay alguna otra manera de utilizar la clase utilizando con diferentes tipos?

En caso negativo, ¿cuál es la forma más adecuada de usarlo?

Respuesta

28
using(Font f1 = new Font("Arial",10.0f)) 
using (Font f2 = new Font("Arial", 10.0f)) 
using (Stream s = new MemoryStream()) 
{ 

} 

Me gusta?

10

No, no puede hacerlo de esta manera, pero puede nest, los bloques using.

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (Font font4 = new Font("Arial", 10.0f)) 
    { 
     // Use font3 and font4. 
    } 
} 

o como dijeron otros, pero no lo recomendaría de esa manera debido a la legibilidad.

using(Font font3 = new Font("Arial", 10.0f)) 
using(Font font4 = new Font("Arial", 10.0f)) 
{ 
    // use font3 and font4 
} 
+10

para ser honesto - Encuentro este último más legible. Si está inicializando tres o cuatro elementos (como stream, streamreader, stream, streamwriter), ¡la anidación puede perder totalmente el control! Supongo que es probablemente a lo que estás acostumbrado. –

+1

Esto depende completamente de un individuo. Lo usas de la forma que te gusta o prefieres. –

+0

Aunque debería ser evidente, la consistencia es lo más importante aquí. – etc

3

que sólo puede tener un único tipo de objeto inicializado en cada bloque using. Puede anidar los tanto como usted desea, sin embargo:

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (Brush b4 = new Brush()) 
    { 

    } 
} 
+0

En realidad, puede tener varios objetos del mismo tipo, como muestra la pregunta. – Codesleuth

2

puede anidar ellos:

using (Font font3 = new Font("Arial", 10.0f)) 
using (font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

Deben disponer en orden inverso (primero font4).

EDIT:

Esto es exactamente lo mismo que:

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (font4 = new Font("Arial", 10.0f)) 
    { 
     // Use font3 and font4. 
    } 
} 
+0

¿Tiene un enlace a la documentación que dice que se deshace en orden inverso? – Dolphin

+0

Creo que lo escuché en un curso, sin embargo, apilarlos es lo mismo que anidarlos. Ver el texto enmendado. –

+1

Es fácilmente evidente a partir de la gramática de los lenguajes tipo C. La sintaxis de a * using-statement * es: using (* variable initialization *) * statement * Tenga en cuenta que ni el apilamiento ni los refuerzos son parte explícita de la sintaxis. Están implícitos en la gramática recursiva. Cuando * statement * es una instrucción using, obtienes apilamiento. Cuando * statement * es * * block-statement *, tiene llaves. –

6

Puede apilar el uso de declaraciones de lograr esto:

using(Font font3 = new Font("Arial", 10.0f)) 
using(Font font4 = new Font("Arial", 10.0f)) 
{ 
    // use font3 and font4 
} 
3

Puede artículos del mismo tipo por comas delimitar - Bueno, todo lo que sé es que el compilador no se queja. También puede apilar las declaraciones using() (use un conjunto de corchetes {}) de diferentes tipos.

http://adamhouldsworth.blogspot.com/2010/02/things-you-dont-know.html

+0

He hecho un comentario en tu blog con respecto al ejemplo de foreach que sigue a tu enlace. –

+0

Buen lugar, lo he cambiado, parecía que estaba ocurriendo, pero todo lo que sucedía era que el compilador le dejaba ignorar los corchetes {}, era solo un foreach anidado. –

5

El uso de propósito declaración es garantizar que los recursos adquiridos se disponen de forma explícita por una llamada a Dispose método proporcionado por la interfaz IDisposable. La especificación no le permite adquirir recursos de diferentes tipos dentro de una única declaración de uso, pero teniendo en cuenta la primera oración, puede escribir este código perfectamente válido en términos del compilador.

using (IDisposable d1 = new Font("Arial", 10.0f), 
    d2 = new Font("Arial", 10.0f), 
    d3 = new MemoryStream()) 
{ 
    var stream1 = (MemoryStream)d3; 
    stream1.WriteByte(0x30); 
} 

Sin embargo, no estoy recomendando este y considero que es abusivo, por lo que esta respuesta es simplemente para indicar que se puede cortar a su alrededor, pero es probable que no debe.

+0

Vote por mostrarnos qué * no * hacer. –

Cuestiones relacionadas