Supongamos que tengo:
public class Bob
{
public int Value { get; set; }
}
Quiero pasar el miembro Value como un parámetro de salida como
Int32.TryParse("123", out bob.Value);
pero obtengo un error de compilación, "el argumento 'out' no está clasificado como variable". ¿Hay alguna forma de lograr esto, o voy a tener que extraer una variable, a la:
int value;
Int32.TryParse("123", out value);
bob.Value = value;
c#
properties
out-parameters
thorncp
fuente
fuente
Respuestas:
Tendría que usar explícitamente un campo y una propiedad "normal" en lugar de una propiedad implementada automáticamente:
public class Bob { private int value; public int Value { get { return value; } set { this.value = value; } } }
Entonces puede pasar el campo como un parámetro de salida:
Int32.TryParse("123", out bob.value);
Pero, por supuesto, eso solo funcionará dentro de la misma clase, ya que el campo es privado (¡y debería serlo!).
Las propiedades simplemente no te permiten 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 le importaba el valor de retorno de
TryParse
, siempre puede escribir su propio método auxiliar:static int ParseOrDefault(string text) { int tmp; int.TryParse(text, out tmp); return tmp; }
Entonces usa:
bob.Value = Int32Helper.ParseOrDefault("123");
De esa manera, puede usar una sola variable temporal incluso si necesita hacer esto en varios lugares.
fuente
Puede lograrlo, 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
out
enValue
, pero en CANAnotherValue
.Esto funcionará
Int32.TryParse("123", out bob.AnotherValue);
Pero, las pautas comunes le dicen que no haga público un campo de clase. Por lo tanto, debe utilizar el enfoque de variable temporal.
fuente