web-dev-qa-db-fra.com

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 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;
74
thorncp

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.

79
Jon Skeet

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.

5