76 votes

Passer une propriété en tant que paramètre 'out' en C #

Supposons que j'ai:

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

Je veux passer le membre Value comme paramètre out comme

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

mais j'obtiens une erreur de compilation, "l'argument 'out' n'est pas classé comme une variable." Existe-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;
 

79voto

Jon Skeet Points 692016

Vous auriez à utiliser explicitement un champ et "normal" de la propriété au lieu d'une auto-mise en œuvre de la propriété:

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

Ensuite, vous pouvez passer le champ comme un paramètre de sortie:

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

Mais bien sûr, cela ne fonctionne que dans la même catégorie, le domaine est privé (et doit!).

Propriétés il suffit de ne pas vous laisser faire cela. Même en VB où vous pouvez passer une propriété par référence ou l'utiliser comme un paramètre de sortie, il n'y a fondamentalement un supplément variable temporaire.

Si vous n'avez pas de soins sur la valeur de retour de l' 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;
}

Ensuite, utilisez:

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

De cette façon, vous pouvez utiliser une seule variable temporaire, même si vous avez besoin de faire cela à plusieurs endroits.

5voto

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 .

Ça va marcher

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

Toutefois, les directives courantes vous conseillent de ne pas rendre public un champ de classe. Donc, vous devriez utiliser l'approche de la variable temporaire.

-1voto

Jaimal Chohan Points 4748

Après avoir réfléchi à cela, vous pourrez peut-être créer une méthode d’extension pour Int32 appelée TryParse.

 public static bool TryParse(this Int32 value, string valueToParse)
{
      value = 0;
      try{ value = Int32.Parse(valueToParse); return true; }
      catch(Excetpion){ }
      return false;
}
 

tu pourrais alors écrire

 Bob bob = new Bob();
if(bob.Value.TryParse("10")) { //logic }
 

Je n'ai pas essayé ça.

-4voto

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

Supposons (si cela est légal en c #) que cela créera une variable temporaire.
Si vous supposez que cela va changer bob.Value , ça ne changera pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X