Supposons que j'ai:
public class Bob
{
public int Value { get; set; }
}
Je veux passer le membre Value comme paramètre de sortie comme
Int32.TryParse("123", out bob.Value);
mais j'obtiens une erreur de compilation, "L'argument 'out' n'est pas classé comme une variable." Y a-t-il un moyen d'y parvenir, ou vais-je devoir extraire une variable, à la:
int value;
Int32.TryParse("123", out value);
bob.Value = value;
Vous devez utiliser explicitement un champ et une propriété "normale" au lieu d'une propriété implémentée automatiquement:
public class Bob
{
private int value;
public int Value
{
get { return value; }
set { this.value = value; }
}
}
Ensuite, vous pouvez passer le champ comme paramètre de sortie:
Int32.TryParse("123", out bob.value);
Mais bien sûr, cela ne fonctionnera que dans la même classe, car le champ est privé (et devrait l'être!).
Les propriétés ne vous permettent tout simplement pas de le faire. Même dans VB où vous pouvez passer une propriété par référence ou l'utiliser comme paramètre de sortie, il y a fondamentalement une variable temporaire supplémentaire.
Si vous ne vous souciez pas de la valeur de retour de TryParse
, vous pouvez toujours écrire votre propre méthode d'assistance:
static int ParseOrDefault(string text)
{
int tmp;
int.TryParse(text, out tmp);
return tmp;
}
Utilisez ensuite:
bob.Value = Int32Helper.ParseOrDefault("123");
De cette façon, vous pouvez utiliser une seule variable temporaire même si vous devez le faire à plusieurs endroits.
Vous pouvez y parvenir, mais pas avec une propriété.
public class Bob {
public int Value { get; set; } // This is a property
public int AnotherValue; // This is a field
}
Vous ne pouvez pas utiliser out
sur Value
, mais vous pouvez sur AnotherValue
.
Cela fonctionnera
Int32.TryParse("123", out bob.AnotherValue);
Mais, des directives communes vous disent de ne pas rendre public un champ de classe. Vous devez donc utiliser l'approche des variables temporaires.