2009-09-02 25 views
67

Supongamos que tengo:Pasar una propiedad como un parámetro 'out' en C#

public class Bob 
{ 
    public int Value { get; set; } 
} 

Quiero pasar el Valor miembro como un parámetro de salida como

Int32.TryParse("123", out bob.Value); 

pero consigo una error de compilación, "argumento 'out' no está clasificado como una variable." ¿Hay alguna manera de lograr esto, o voy a tener que extraer una variable, a la:

int value; 
Int32.TryParse("123", out value); 
bob.Value = value; 
+0

posible duplicado de [¿Es posible pasar propiedades como parámetros de "salida" o "ref"?] (Http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as -out-or-ref-parameters) – nawfal

Respuesta

75

Habría que utilizar explícitamente un campo y la propiedad "normal" en lugar de un auto-aplicado propiedad:

public class Bob 
{ 
    private int value; 
    public int Value 
    { 
     get { return value; } 
     set { this.value = value; } 
    } 
} 

entonces puede pasar al campocomo un parámetro de salida:

Int32.TryParse("123", out bob.value); 

Pero, por supuesto, que sólo funcionará dentro de la misma clase, ya que el campo es privado (¡y debería ser!).

Las propiedades simplemente no te dejan hacer esto. Incluso en VB donde puede pasar una propiedad por referencia o usarla como un parámetro de salida, básicamente hay una variable temporal adicional.

Si no se preocupan por el valor de retorno de TryParse, siempre se puede escribir su propio método de ayuda:

static int ParseOrDefault(string text) 
{ 
    int tmp; 
    int.TryParse(text, out tmp); 
    return tmp; 
} 

A continuación, utilice:

bob.Value = Int32Helper.ParseOrDefault("123"); 

De esta manera se puede utilizar una sola variable temporal incluso si necesita hacer esto en varios lugares.

+1

Creo que el problema con el primer enfoque es que si utiliza el campo directamente (en lugar de la propiedad), puede estar pasando por alto las reglas de validación que pueden existir en la propiedad –

+0

@Dreas: if es una propiedad autoimplementada de antemano, no puede tener ninguna regla de validación ... –

+3

@Jon: creo que le gustaría cambiar int.Parse a int.TryParse en el ejemplo de ParseOrDefault. – shahkalpesh

4

Puede lograr eso, pero no con una propiedad.

public class Bob { 
    public int Value { get; set; } // This is a property 

    public int AnotherValue; // This is a field 
} 

No se puede utilizar en outValue, pero puede hacerlo en AnotherValue.

Esto funcionará

Int32.TryParse("123", out bob.AnotherValue); 

Pero, directrices comunes que dice que no hacer público un campo de clase. Entonces debes usar el enfoque de variable temporal.

+0

Oh, sí * campo *, utilicé el término equivocado. –

Cuestiones relacionadas