11
votes

C #: Ce champ est-il sécurisé?

dans cet extrait:

class ClassWithConstants
{
    private const string ConstantA = "Something";
    private const string ConstantB = ConstantA + "Else";

    ...

}


2 commentaires

@Svish, s'il vous plaît voir le commentaire de Jon Skeet sur sa réponse


@Nathan, merci, n'avait pas remarqué ceci: p


3 Réponses :


3
votes

Cette concaténation de la chaîne se produit à la compilation, car il n'y a que des littéraux de chaînes (recherche de pliante constante dans la littérature de construction du compilateur).

Ne vous inquiétez pas pour ça.


0 commentaires

2
votes

Il devrait toujours évaluer à "quelque chose"


0 commentaires

37
votes

Vous obtiendrez toujours "quelque chose". C'est parce que ConstatB dépend de Constanta.

Vous pouvez même commuter des lignes et vous obtiendrez le même résultat. Le compilateur sait que ConstatB dépend de Constanta et le gérera en conséquence, même si vous l'écrivez dans des classes partielles.

Pour être totalement sûr que vous pouvez exécuter une invite de commande vs et appelez il ILDASM. Là, vous pouvez voir le code compilé réel.

En outre, si vous essayez de faire ce qui suit, vous obtiendrez une erreur de compilation: xxx

Erreur : l'évaluation de la valeur constante de 'ConsoleApplication2.Program.ConStantB' implique une définition circulaire Ce type de prouve que le compilateur connaît ses dépendances.


ajouté: référence spécifique pointée par JON Skeet :

Ceci est explicitement mentionné à la section 10.4 de la spécification C # 3: Les constantes sont autorisées à dépendre d'autres constantes dans le même programme que les dépendances ne sont pas de nature circulaire. Le compilateur organise automatiquement pour évaluer les déclarations constantes dans l'ordre approprié.



3 commentaires

Yup, tu as raison - Doh! :) Essayer de trouver le bit dans la spécification qui garantit ceci ...


Edité ma réponse, donc au moins, cela ne va pas induire les gens en erreur, mais la supprimera si / quand je peux.


C'est sympa. Je suis sûr que les compilateurs de Java ne font pas de telles choses, et il est basé uniquement sur la commande.