2010-06-30 15 views
5

Ho letto che ci sono buoni motivi per usare le proprietà invece dei campi in C# su SO. Quindi ora voglio convertire il mio codice dall'utilizzo dei campi all'utilizzo delle proprietà.Esiste un modo elegante per impostare un valore predefinito per una proprietà in C#?

Per un campo istanza di una classe, è possibile impostare un valore predefinito. Per esempio:

int speed = 100; 

Per la proprietà equivalente, che mi sembra:

int Speed { get; set; } 

La mia comprensione è che la proprietà di velocità verrà inizializzato a zero quando la classe viene creata un'istanza. Non sono stato in grado di scoprire come impostare un valore predefinito per aggiornare facilmente il mio codice. C'è un modo elegante per fornire un valore predefinito per una proprietà?

Sembra che ci dovrebbe essere un modo elegante per farlo, senza usare un costruttore, ma proprio non riesco a scoprire come.

+0

Cosa c'è di sbagliato con l'utilizzo di un costruttore? O utilizzando una proprietà con un campo di supporto definito manualmente invece di una proprietà autopratica? –

+0

Rende più semplice il mio lavoro di conversione se posso modificare il campo in una proprietà nello stesso punto in cui il campo è stato dichiarato in precedenza. Usando un costruttore avrei bisogno di scorrere il mio codice per apportare la modifica. Non ero a conoscenza del fatto che si potesse usare un campo di supporto inizializzato. –

+0

Novità in C# 6: [Inizializzatori per proprietà automatiche] (https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#auto-proprietà-miglioramenti) –

risposta

7

La cosa migliore è di fare una normale proprietà vecchio campo-backed, come:

private int _speed = 100; 
public int Speed { get { return _speed; } set { _speed = value; } } 
+0

Grazie per il codice. Questo è abbastanza elegante e non devo usare un costruttore. Brillante. –

+0

Nessun prob. Questo è ciò che vedrai sempre per codice scritto prima di .NET 3.0. Con 3.0, è stata introdotta la proprietà automatica, ma si incontra esattamente il problema che si è presentato, in cui non è possibile definire un valore predefinito semplicemente, senza utilizzare il costruttore. –

+0

Mi piace ancora il vecchio modo di fare le proprietà, tuttavia può causare confusione perché non si sa da che parte ottenere/impostare il valore all'interno della classe. Usi la variabile di istanza o usi la proprietà? –

1

è necessario impostare il valore predefinito per la proprietà nel costruttore. Non c'è altro modo per farlo oltre a questo per le proprietà automatiche poiché i campi per i puntelli automatici sono dichiarati in fase di compilazione e sostituiti all'interno di getter/setter. Tuttavia, nelle proprietà esplicite, è possibile inizializzare il campo che la proprietà utilizza per leggere o scrivere come menzionato da Joe nella sua risposta.

0

Il costruttore è l'unico modo per impostare il valore iniziale di una proprietà di auto.

1

CciSharp supporta DefaultValue attribute, che consente di inserire valori predefiniti sulle proprietà automatiche. Se CciSharp si qualifica come una soluzione "elegante", tuttavia, è una questione di opinione (agisce come un post-compilatore che modifica l'IL nel file binario).

2

Il modello di progettazione che utilizzo, utilizzato nei controlli Windows.Forms e in altre classi .NET di Microsoft. Inoltre, dalla mia comprensione, l'inizializzazione esterna al contructor consente al compilatore just-in-time di ottimizzare il codice di classe.

public class Foo { 
    public static const int DefaultSpeed = 100; 
    private int _speed = DefaultSpeed; 
    [DefaultValue(DefaultSpeed)] 
    public int Speed { get { return _speed; } set { _speed = value; } } 
} 

public class Foo { 
     public static Color DefaultForecolor { get {return SystemColors.WindowText; }} 
     private Color _forecolor = DefaultForecolor; 
     [DefaultValue(DefaultForeColor)] 
     public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } } 
    } 
Problemi correlati