web-dev-qa-db-fra.com

valeur par défaut pour une propriété statique

J'aime c #, mais pourquoi puis-je faire:

public static bool Initialized { private set; get; }

ou ca :

public static bool Initialized = false;

mais pas un mélange des deux en une seule ligne?

J'ai juste besoin de définir le niveau d'accès à ma variable (ensemble privé), et j'ai besoin qu'il soit défini sur false au démarrage. Je ne voudrais pas rendre cette variable _Initialized privée ennuyeuse, qui serait retournée par le getter de la var publique Initialized. J'aime que mon code soit beau. (NB: ma variable est statique, elle ne peut pas être initialisée dans le constructeur).

Merci

46
Blitzz

Vous pouvez utiliser un constructeur statique

static MyClass()
{
    Initialized = false;
}

Cependant, comme cela a été mentionné par d'autres, la valeur par défaut d'un booléen sera fausse.

53
Corey Sunwold

Depuis C # 6:

public static bool Initialized { private set; get; } = false;
18
Mehrdad Mirreza

Vous pouvez simplement faire:

public static bool Initialized { private set; get; }

Comme les valeurs bool sont toujours fausses par défaut, il n'est pas nécessaire de l'initialiser.

Si vous avez besoin que cela soit vrai par défaut, ou pour avoir une logique plus complexe, vous devez le faire dans un constructeur statique ou utiliser un champ de support.

Quant à "J'aime que mon code soit beau" - personnellement, pour une initialisation non par défaut, je pense que c'est tout aussi "beau":

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

Cela rend l'initialisation à une valeur par défaut très visible, ce qui n'est pas une mauvaise chose.

6
Reed Copsey

Les deux blocs de code que vous avez mentionnés sont deux choses différentes.

Le premier bloc est un définition de propriété implémentée automatiquement . C'est du sucre syntaxique pour une définition de propriété complète qui ressemble à ceci:

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

Votre deuxième bloc de code est un définition de membre statique . Si vous regardez l'extension que j'ai donnée ci-dessus, vous remarquerez qu'elle inclut une définition de membre statique privé. Si vous souhaitez fournir une valeur initiale, vous pouvez le faire ici:

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

La définition de propriété en ligne que vous utilisez a été conçue uniquement pour raccourcir le code dans le cas le plus courant. Si vous voulez faire autre chose, vous pouvez utiliser la forme complète du code de propriété.

Alternativement, vous pouvez emprunter une route complètement différente et utiliser un constructeur statique. (Voir réponse de Corey )

3
Simon P Stevens