2009-09-02 8 views
67

Supposons que j'ai:En passant une propriété comme un « out » paramètre en C#

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

Je veux passer le membre Valeur comme paramètre comme de

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

mais je reçois un erreur de compilation, "" "out" argument n'est pas classé comme une variable. " Y at-il moyen d'y parvenir, ou vais-je avoir à extraire une variable, à la:

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

duplication possible de [Est-il possible de transmettre les propriétés comme paramètres "out" ou "ref"?] (Http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as -out-or-ref-parameters) – nawfal

Répondre

75

Il faudrait utiliser explicitement un champ et la propriété « normale » au lieu d'une mise en œuvre automatique 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 paramètre sur:

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

Mais bien sûr, cela ne fonctionnera dans les la même classe, car le champ est privé (et devrait l'être!).

Les propriétés ne vous permettent simplement pas de le faire. Même dans VB où peut peut passer une propriété par référence ou l'utiliser comme un paramètre out, il existe essentiellement une variable temporaire supplémentaire.

Si vous ne se soucient 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; 
} 

Ensuite, utilisez:

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

De cette façon, vous pouvez utiliser un seul variable temporaire même si vous devez le faire à plusieurs endroits.

+1

Je pense que le problème avec la première approche est que si vous utilisez le champ directement (au lieu de la propriété), vous pouvez contourner les règles de validation qui peuvent exister dans la propriété –

+0

@Dreas: if c'est une propriété autoimplémentée à l'avance, il ne peut y avoir aucune règle de validation ... –

+3

@Jon: Je pense que vous voudriez changer int.Parse en int.TryParse dans l'exemple ParseOrDefault. – shahkalpesh

4

Vous pouvez réaliser cela, 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 le AnotherValue.

Cela fonctionne

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

Mais, des lignes directrices vous dit de ne pas rendre publique sur le terrain de classe. Donc, vous devriez utiliser l'approche variable temporaire.

+0

Oh ouais * champ *, j'ai utilisé le mauvais terme. –

Questions connexes