2010-04-07 20 views
41

ho come C#, ma perché posso fare:valore predefinito per una proprietà statica

public static bool Initialized { private set; get; } 

o questo:

public static bool Initialized = false; 

ma non un mix di entrambi in una linea?

Ho solo bisogno di impostare il livello di accesso alla mia variabile (set privato), e ho bisogno di impostarlo su false all'avvio. Non vorrei creare quella noiosa variabile _Initialized privata, che verrebbe restituita dal getter del pubblico varializzato Initialized. Mi piace che il mio codice sia bello. (NB: la mia variabile è statica, non può essere inizializzata nel costruttore).

Grazie

+3

Può essere inizializzato nel costruttore, se il costruttore è troppo statico! – snicker

+7

Non sarà FALSE di default comunque lol?Ad ogni modo, apprezzo che tu stia facendo la domanda generale. –

+0

A differenza delle variabili locali, che non sono definite per impostazione predefinita, i campi (variabili di livello di classe) e quindi anche le variabili di supporto delle proprietà vengono sempre inizializzati sul loro valore predefinito, che è 'false' per Booleans. –

risposta

49

si potrebbe usare un static constructor

static MyClass() 
{ 
    Initialized = false; 
} 

Tuttavia, come è stato detto da altri il valore predefinito di un bool sarà falsa.

+11

I costruttori statici sono la vita della festa. – snicker

6

Hai solo può fare:

public static bool Initialized { private set; get; } 

Dal bool valori sono sempre false per impostazione predefinita, non c'è bisogno di inizializzare esso.

Se è necessario che questo sia true per impostazione predefinita o per avere una logica più complessa, è necessario farlo in un costruttore statico o utilizzare un campo di supporto.

Per quanto riguarda "Mi piace il mio codice per essere bella" - personalmente, per l'inizializzazione non predefinita, penso che questo è altrettanto "bello":

private static bool initialized = true; 
public static bool Initialized { get { return initialized; } } 

Questo rende l'inizializzazione a un non di default molto visibile, che non è una brutta cosa.

+1

Non penso che sia "così bello", dal punto di vista di Intellisense, ora hai due variabili accessibili con lo stesso nome, solo con case diverse, una delle quali è completamente di sola lettura. Inoltre .. (questo è puramente dal punto di vista di un avvocato del diavolo) cosa succede se la specifica C# cambia e il valore predefinito per bool diventa vero? Improbabile, ma è meglio essere espliciti che assumere. – snicker

+0

@snicker: il valore predefinito per bool fa parte della specifica C#, che non cambierà. Per quanto riguarda l'intellisense, vedrai solo la proprietà di sola lettura "Initializer" a meno che tu non sia all'interno di un metodo all'interno della classe, nel qual caso è abbastanza ovvio quale è il caso in cui ... –

+0

Lo so, io stava facendo una mezza barzelletta sulle specifiche. Non vorrei ancora vedere "inizializzato" e "Inizializzato" nell'elenco quando spesso digiterò lettere minuscole e userei il tab-completion. Non saprò con certezza quale otterrò (sarà l'ultimo selezionato usando Intellisense) – snicker

3

I due blocchi di codice che hai citato sono due cose diverse.

Il primo blocco è un auto implemented property defination. Questo è zucchero sintattico per un defination piena proprietà che assomiglia a questo:

private static bool _initialized; 
public static bool Initialized 
{ 
    private set 
    { 
     _initialized = value; 
    } 
    get 
    { 
     return _initialized; 
    } 
} 

tuo secondo blocco di codice è un static member definition. Se osservi l'espansione che ho indicato sopra, noterai che include una definizione di membro statico privato. Se si desidera fornire un valore iniziale si può fare qui:

private static bool _initialized = false; 
public static bool Initialized 
{ 
    private set 
    { 
     _initialized = value; 
    } 
    get 
    { 
     return _initialized; 
    } 
} 

La definizione di proprietà in linea che si sta utilizzando è stato progettato solo per rendere il codice un po 'più breve nel caso più comune. Se si desidera fare qualcos'altro, è possibile utilizzare il modulo completo del codice proprietà.

In alternativa, è possibile seguire un percorso completamente diverso e utilizzare un costruttore statico. (Vedere Corey's answer)

+2

"Lo zucchero sintattico" è ciò che rende "codice bello". Sono sicuro che l'OP * sa * che questo è ciò che sta realmente accadendo, ma ha specificamente richiesto una soluzione di "bellezza" comparabile ... per la quale penso che il costruttore statico sia il percorso migliore. – snicker

11

Poiché C# 6:

public static bool Initialized { private set; get; } = false; 
Problemi correlati