2012-04-03 855 views
6

Quiero usar la declaración using puramente para la administración del alcance. ¿Puedo omitir la celebración de una referencia explícita al objeto subyacente que implementa IDisposable?¿Puedo usar la instrucción de uso con RHV (valor de la mano derecha)?

Por ejemplo, dando a este declaraions:

class ITransactionScope : IDisposable {} 
class TransactionGuard : ITransactionScope {...} 

class DbContext 
{ 
    public IDisposable ITransactionScope() 
    { 
     return new TransactionGuard(); 
    } 
} 

¿Puedo hacer lo siguiente:

void main() 
{ 
    var dbContext = new DbContext(); 

    using (dbContext.TransactionScope()) 
    { 
     // the guard is not accessed here 
    } 
} 

Es TransactionGuard ejemplo vivo durante using declaración?

+0

Puedes intentarlo. Establezca un punto de interrupción en el método 'Dispose()' de la instancia de scope devuelta y vea si recibe una llamada. – linuxuser27

+0

Realmente espero que puedas porque utilizo la misma estrategia y funciona :) –

+3

Si todo lo que te importa es la gestión del alcance, no puedes simplemente poner llaves en el código (sin el 'uso') y que será el explícito alcance para el código dentro? –

Respuesta

10

Quiero usar la declaración using puramente para la administración del alcance.

Debe usar la declaración using para lo que está diseñado: deshacerse de un recurso no administrado de manera oportuna. Si no es para lo que está usando using, probablemente esté haciendo algo mal.

¿Puedo omitir la celebración de una referencia explícita al objeto subyacente que implementa IDisposable?

Como otra respuesta señaló: usted ya escribió el código; podrías simplemente haberlo intentado.

Sí, puedes hacer eso. El compilador creará una variable local invisible para usted y llamará al Dispose.

Recomiendo que si tiene más preguntas sobre el uso de using, lea la sección 8.13 de la especificación C# 4.

+0

¿podría echar un vistazo a mi respuesta? ¿GC no lo reclamaría? – Aliostad

+0

@Aliostad: La especificación C# establece que 'using (expr) s;' es exactamente equivalente a 'X temp = expr; prueba {s; } finally {if (temp! = null) ((IDisposable) temp) .Dispose();} '. ¿Es su reclamo que el recolector de basura limpiará la temperatura * antes * de la llamada a 'Dispose'? –

+0

@Eric Quizás podría hablar con el equipo de MVC sobre el abuso de las características de C#. ;) No me importa este; es una sintaxis útil, y no usa reflexión. –

2

Está vivo hasta que se deshaga de él. Entonces sí.

Y este tipo de pregunta es TAN más fácil para que usted responda simplemente apretando el botón de compilación y ejecución. YA TIPÓ EL CÓDIGO. INTENTALO.

+1

-1. Esto no es necesariamente cierto. Puede probar y funciona 100 veces, pero no la última vez. – Aliostad

+5

@Aliostad: No te estoy siguiendo. La crítica parece completamente justificada; la pregunta podría haber sido respondida fácilmente simplemente intentándola, o mejor aún, leyendo la documentación y luego probándola. ¿Puede darme un ejemplo de un programa donde una declaración de uso funciona cien veces seguidas y luego falla? –

+0

@EricLippert mi punto era que GC podría reclamarlo antes del final de la utilización de 'statement'. de ahí mi respuesta, le agradecería que la revise. – Aliostad

Cuestiones relacionadas