2012-07-24 7 views
14

Supongamos que tengo el siguiente código de clase y el ejemplo desechable para ejecutarlo:C# - ¿Por qué no puedo pasar una clase declarada en una instrucción using como un tipo de referencia?

public class DisposableInt : IDisposable 
{ 
    private int? _Value; 

    public int? MyInt 
    { 
     get { return _Value; } 
     set { _Value = value; } 
    } 

    public DisposableInt(int InitialValue) 
    { 
     _Value = InitialValue; 
    } 

    public void Dispose() 
    { 
     _Value = null; 
    } 
} 

public class TestAnInt 
{ 
    private void AddOne(ref DisposableInt IntVal) 
    { 
     IntVal.MyInt++; 
    } 

    public void TestIt() 
    { 
     DisposableInt TheInt; 
     using (TheInt = new DisposableInt(1)) 
     { 
      Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt)); 
      AddOne(ref TheInt); 
      Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt)); 
     } 
    } 
} 

Calling new TestAnInt().TestIt() corre muy bien. Sin embargo, si cambio de TestIt() modo que DisposableInt se declara en el interior de la instrucción using de este modo:

public void TestIt() 
    { 
     // DisposableInt TheInt; 
     using (DisposableInt TheInt = new DisposableInt(1)) 
     { 
      Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt)); 
      AddOne(ref TheInt); 
      Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt)); 
     } 
    } 

me sale el siguiente error de compilación:

Cannot pass 'TheInt' as a ref or out argument because it is a 'using variable' 

¿Por qué es esto? ¿Qué es diferente, aparte de la clase, está fuera del alcance y del recolector de basura una vez que finaliza la declaración using?

(y sí, sé que mi ejemplo de la clase desechable está bastante tonto, sólo estoy tratando de mantener las cosas simples)

+2

Solo un consejo: convencionalmente, las variables Java se nombran con la primera letra minúscula y camelCasadas en límites de palabras. Su variable 'TheInt' debe ser renombrada' theInt'. Ayuda a la legibilidad de tu código a otros si sigues las convenciones. –

+0

Su código de ejemplo ni siquiera necesita ninguna referencia, ya que no está tratando de cambiar la referencia. –

Respuesta

26

Why is this?

variables declaradas en using declaraciones son de sólo lectura; Los parámetros out y ref no lo son. Por lo que puede hacer esto:

DisposableInt theInt = new DisposableInt(1); 
using (theInt) 
{ 
    AddOne(ref theInt); 
} 

... pero fundamentalmente no estás usando el hecho de que es un parámetro ref de todos modos ...

Es posible que usted ha entendido mal lo ref realmente significa. Sería una buena idea leer mi article on parameter passing para asegurarte de que realmente entiendes.

+1

¡Gracias! El eslabón perdido para mí fue que una 'variable de uso' es de solo lectura. Creo que entiendo por qué: porque entonces podría decir theInt = new DisposableInt (2) * inside * ¡la declaración de uso revocando las cosas de manera real! Así que incluso mi código de muestra "en funcionamiento" es una mala práctica, supongo. – Irinotecan

Cuestiones relacionadas