2010-04-07 17 views
41

me gusta C#, pero qué puedo hacer:valor predeterminado de una propiedad estática

public static bool Initialized { private set; get; } 

o esto:

public static bool Initialized = false; 

pero no una mezcla de ambos en una línea?

Solo necesito establecer el nivel de acceso a mi variable (conjunto privado), y lo necesito configurado en falso al inicio. No me gustaría hacer esa aburrida variable Privada inicializada, que sería devuelta por el comprador de la var. Inicializada pública. Me gusta que mi código sea hermoso. (NB: mi variable es estática, no se puede inicializar en el constructor).

Gracias

+3

Puede ser inicializado en el constructor si el constructor es estática también! – snicker

+7

¿No será FALSO por defecto de todos modos lol?De todos modos, aprecio que estés haciendo la pregunta general. –

+0

A diferencia de las variables locales, que no están definidas por defecto, los campos (variables de nivel de clase) y, por lo tanto, también las variables de propiedades de respaldo se inicializan siempre a su valor predeterminado, que es 'falso' para los booleanos. –

Respuesta

49

Se puede usar un static constructor

static MyClass() 
{ 
    Initialized = false; 
} 

Sin embargo, como se ha mencionado en otros el valor por defecto de un bool será falsa.

+11

Los constructores estáticos son la vida de la fiesta. – snicker

6

Sólo puede hacer:

public static bool Initialized { private set; get; } 

Desde bool valores son siempre false de forma predeterminada, no hay necesidad de inicializarlo.

Si necesita que esto sea cierto de manera predeterminada, o para tener una lógica más compleja, debe hacer esto en un constructor estático o usar un campo de respaldo.

En cuanto a "me gusta mi código para ser bella" - personalmente, para la inicialización no predeterminado, creo que esto es tan "hermosa":

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

Esto hace que la inicialización a un no por defecto muy visible, lo cual no es malo.

+1

No creo que sea "tan hermoso", desde la perspectiva de Intellisense, ahora tiene dos variables que son accesibles con el mismo nombre, solo que con diferentes casos, uno de los cuales es completamente de solo lectura. Además ... (esto es puramente desde la perspectiva de un defensor del diablo) ¿qué pasa si la especificación C# cambia y el valor predeterminado para bool se convierte en verdad? Poco probable, pero es mejor ser explícito que suponer. – snicker

+0

@snicker: El valor predeterminado para bool es parte de la especificación C# - eso no cambiará. En lo que concierne a intellisense, solo verás la propiedad de solo lectura del "Inicializador" a menos que estés dentro de un método dentro de la clase, en cuyo caso, es bastante obvio cuál es el que por medio de la cubierta ... –

+0

Lo sé, yo estaba haciendo una media broma sobre la especificación. Todavía no me gustaría ver "inicializado" e "Inicializado" en la lista cuando a menudo escribo en minúscula y uso la terminación de tabulación. No sabré con certeza cuál obtendré (será el último seleccionado con Intellisense) – snicker

3

Los dos bloques de código que ha mencionado son dos cosas diferentes.

El primer bloque es un auto implemented property defination. Este es el azúcar sintáctica para un defination plena propiedad que se parece a esto:

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

Su segundo bloque de código es un static member definition. Si miras la expansión que he dado arriba, notarás que incluye una definición de miembro estático privado. Si desea proporcionar un valor inicial puede hacerlo aquí:

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

La definición de propiedad en línea que está usando se diseñó sólo para hacer que el código un poco más corto en el caso más común. Si desea hacer algo más, puede usar la forma completa del código de propiedad.

Alternativamente, puede tomar una ruta completamente diferente y usar un constructor estático. (Ver Corey's answer)

+2

"Azúcar sintáctico" es lo que hace que "código hermoso". Estoy seguro de que el OP * sabe * que esto es lo que realmente está sucediendo, pero ha solicitado específicamente una solución que sea de "belleza" comparable ... por lo que creo que el constructor estático es la mejor opción. – snicker

11

Puesto que C# 6:

public static bool Initialized { private set; get; } = false; 
Cuestiones relacionadas