2009-08-17 3 views
11

Dans cet extrait:C#: Cette affectation de zone est-elle sûre?

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

    ... 

} 

Y at-il un risque de se retrouver avec ConstantB == "Else"? Ou est-ce que les assigments se produisent linéairement?

+0

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

+0

@Nathan, merci, n'avaient pas remarqué ceci: p – Svish

Répondre

37

Vous obtiendrez toujours "SomethingElse". C'est parce que ConstantB dépend de ConstantA.

Vous pouvez même changer de ligne et vous obtiendrez le même résultat. Le compilateur sait que ConstantB dépend de ConstantA et le gérera en conséquence, même si vous l'écrivez dans des classes partielles. Pour être complètement sûr, vous pouvez exécuter l'invite de commande VS et appeler ILDASM. Là, vous pouvez voir le code réel compilé.

De plus, si vous essayez de faire ce qui suit, vous obtiendrez une erreur de compilation:

private const string ConstantB = ConstantA + "Else"; 
private const string ConstantA = "Something" + ConstantB; 

Erreur: L'évaluation de la valeur constante pour « ConsoleApplication2.Program.ConstantB » implique une définition circulaire Cela prouve que le compilateur connaît ses dépendances.


Ajouté: référence Spec a par Jon Skeet:

This is explicitly mentioned in section 10.4 of the C# 3 spec: Constants are permitted to depend on other constants within the same program as long as the dependencies are not of a circular nature. The compiler automatically arranges to evaluate the constant declarations in the appropriate order.


+2

Eh oui, vous a raison! :) Essayer de trouver le bit dans la spécification qui le garantit ... –

+0

Trouvé maintenant - section 10.4. –

+3

J'ai édité ma réponse pour qu'au moins ça n'induise pas les gens en erreur, mais je vais l'effacer si/quand je peux. –

3

Cette concaténation de chaîne se produit au moment de la compilation car il n'y a que des littéraux de chaîne (recherchez pli constant dans la documentation sur la construction de compilateurs).

Ne vous inquiétez pas pour le reste.

2

Il faut toujours évaluer à "SomethingElse"

Questions connexes