2010-08-04 11 views
9

¿Tiene sentido esto?Uso de la declaración "using" para eliminar

Tener una clase simple

class Test 
    { 
    public Test() 
    { 
     // Do whatever 
    } 
    } 

y luego instanciándola

using(new Test()) 
{ 
    // Nothing in here 
} 

La instrucción using está allí sólo para asegurarse de prueba está dispuesto. Cuándo estará dispuesta si acabo de llamar

new Test() 
+10

¿Es esto bajo el supuesto de que '' test' implementa IDisposable'? –

+0

No, no es así. ¿Cómo saber si una clase necesita implementarlo o no? ¿Siempre lo haces? – Jla

+3

I * sospecho * que está confundiendo "colección de gargage" y "eliminación", que son dos conceptos relacionados pero muy diferentes. –

Respuesta

11

Test no es IDisposable, por lo que ni siquiera se compilará. Pero si era desechable, sí using lo hará, y new por sí mismo no va a . Es un uso inusual de , pero he visto algo similar. Raramente.

Según su comentario (pregunta principal), I sospechoso que está confundiendo la recolección y eliminación de basura. No hay forma de obligar a que se recopile algo, excepto GC (que debe no hacer). A menos que tenga realmente una buena razón para desear que se recopile, simplemente déjela pasar, lo más probable es que sea "generación 0" y se obtendrá de forma económica.

Además, el "hacer lo que sea" sugiere haciendo algo en un constructor pero sin preocuparse por el objeto creado; un método estático sería preferible:

public class Test { /* could be static */ 
    public static void DoSomething() { ... } 
} 
... 
Test.DoSomething(); 
+0

Discutiría sobre el 'uso inusual', de hecho, lo uso con bastante frecuencia. – nothrow

+0

@Yossarian: ¿puede explicar por qué y cómo es mejor que un método normal? – Kobi

+0

bien: algunas acciones (iniciales) se combinan con otra acción (final), por ejemplo: 'HtmlWriter.RenderBeginTag()', 'RenderEndTag()'. Si lanzas una excepción entre estos dos (o si no te olvidas de 'RenderEndTag'), se obtendrá un formato incorrecto html/xml. Entonces, escribí el método de extensión sobre RenderBeginTag, que devuelve una clase IDisposable simplemente llamando a RenderEndTag, y ahora veo claramente, (a través de la indentación) donde se abre/cierra la etiqueta. Otro ejemplo es medir cuánto tiempo tardó algún bloque en ejecutarse. Pero, YMMV. – nothrow

2

Al no asignar la instancia a una variable, será elegible para GC en cuanto se sale del ámbito.

O, ¿hay algo más que esté tratando de lograr con esto?

+0

Nada más. Como Marc subrayó, estaba ejecutando mis acciones en el constructor de la clase, lo que parece ser una mala (o al menos inusual) práctica. No necesito la clase más allá de eso. – Jla

Cuestiones relacionadas