2009-09-02 12 views
67

Supponiamo che io sono:Passando una proprietà come parametro di 'fuori' in C#

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

voglio passare il Valore membro come parametro fuori come

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

ma ho un errore di compilazione, "L'argomento 'out' non è classificato come variabile." non v'è alcun modo per raggiungere questo, o sto andando ad avere per estrarre una variabile, à la:

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

possibile duplicato di [È possibile passare proprietà come parametri "out" o "ref"?] (Http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as -out-or-ref-parameters) – nawfal

risposta

75

Dovresti utilizzare in modo esplicito un campo e "normale" proprietà invece di un auto-implementato proprietà:

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

Poi si può passare il campo come parametro out:

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

Ma, naturalmente, che funzionerà solo all'interno la stessa classe, in quanto il campo è privato (e dovrebbe essere!).

Le proprietà non consentono di farlo. Anche in VB, dove è possibile passare una proprietà per riferimento o utilizzarla come parametro out, è fondamentalmente una variabile temporanea aggiuntiva.

Se non avete a cuore il valore di ritorno di TryParse, si può sempre scrivere il proprio metodo di supporto:

static int ParseOrDefault(string text) 
{ 
    int tmp; 
    int.TryParse(text, out tmp); 
    return tmp; 
} 

Quindi utilizzare:

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

In questo modo è possibile utilizzare un unico variabile temporanea anche se è necessario farlo in più punti.

+1

Penso che il problema con il primo approccio sia che se si utilizza direttamente il campo (anziché la proprietà), è possibile ignorare le regole di convalida che possono esistere nella proprietà –

+0

@Dreas: if è una proprietà autoimplementata in anticipo, non può possibilmente avere alcuna regola di validazione ... –

+3

@Jon: Penso che ti piacerebbe cambiare int.Parse in int.TryParse nell'esempio ParseOrDefault. – shahkalpesh

4

È possibile ottenere ciò, ma non con una proprietà.

public class Bob { 
    public int Value { get; set; } // This is a property 

    public int AnotherValue; // This is a field 
} 

Non è possibile utilizzare il outValue, ma è possibile su AnotherValue.

Ciò funzionerà

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

Ma, linee guida comuni che si dice di non fare una pubblica campo di classe. Quindi dovresti usare l'approccio variabile temporaneo.

+0

Oh sì * campo *, ho usato il termine sbagliato. –

Problemi correlati