C'est juste une supposition, mais je pense que la raison pourrait avoir à faire avec le fait que const valeurs dans les métadonnées (qui a subtils conséquences tout, c'est propre) lors de la compilation. Je me demande si peut-être que le compilateur a quelques problèmes à trouver comment transformer une var de métadonnées.
Dans Richter CLR VIA C# (page 177),
La définition d'une constante provoque la création
de métadonnées. Lorsque le code se réfère à une
constante de symbole, les compilateurs rechercher
ce symbole dans les métadonnées de la
assemblée qui définit la constante,
extrait de la constante de valeur, et
incorporer la valeur dans le émise IL
code.
Il fait la remarque que cela signifie que vous ne pouvez pas faire référence à la mémoire d'une constante pour cette raison. Pour rendre tout ceci un peu plus explicite, dans la pseudo C# si le montage A définit un const:
//Assembly A, Class Widget defines this:
public static const System.Decimal Pi = 3.14
ensuite, vous avez un consommateur d'Un:
//somewhere in the Program.exe assembly
decimal myCircleCurcum = 2 * Widget.pi
la résultante compilé IL de program.exe ferais quelque chose comme ce pseudo-code:
// pseudo-IL just to illustrate what would happen to the const
myCircleCurcum = 2*3.14
notez que la consommer de l'assemblée n'a aucune idée que le séparateur décimal 3.14 avait aucune relation à l'Assemblée Une à tous--c'est à program.exe une valeur littérale. Cela, pour moi, est un moyen raisonnable pour le compilateur C# de loi--après tout, l'Assemblée A déclaré explicitement que pi est une constante (ce qui signifie que la valeur est une fois pour toutes pi=3.14). Mais, je me risquerais à deviner, que 99% de C# développeurs ne comprennent pas les conséquences de cette & peut changer pi être 3.1415 sur un coup de tête.
Les constantes ont une très mauvaise de la croix-version de l'assembly histoire (encore une fois, cela vient de Richter) parce que le consommateur de l'assemblée avec une constante dans il ne va pas voir un changement si le montage d'Un constant changement (c'est à dire qu'il a été recompilé). Cela peut entraîner vraiment difficile de comprendre bugs par la consommation de l'assemblée A. . . tellement que je ban mon équipe à partir de l'utilisation des constantes. Leur léger gain de perf n'est pas la peine de les bogues subtils qu'ils peuvent causer.
Vous pouvez vraiment ne jamais utiliser une constante si vous savez que la valeur ne changera jamais , et même avec quelque chose comme const tels que pi, vous ne pouvez pas dire à coup sûr que vous ne voulez pas que votre precision changer dans le futur.
si l'assemblée définit:
decimal const pi = 3.14
ensuite, vous construisez et puis d'autres assemblées consommer, si vous changez de l'assemblée:
decimal const pi = 3.1415
et la reconstruction de l'assemblée, le consommateur de l'assemblée auront toujours l'ancienne valeur 3.14! pourquoi? parce que l'original 3.14 a été défini comme une constante, ce qui signifie que les consommateurs de l'assemblée a été dit que la valeur ne change pas, de sorte qu'ils peuvent cuire que la valeur de pi dans leurs propres métadonnées (si vous reconstruire des consommateurs de l'assemblée, il sera alors obtenir la nouvelle valeur de pi dans les métadonnées). Encore une fois, je ne vois pas cela comme un problème avec la façon dont le SCC gère des constantes, c'est juste que les développeurs n'est probablement pas s'attendre à ce que d'une constante ne peut pas être modifié de façon sécuritaire dans certaines circonstances, où il peut être modifié en toute sécurité dans d'autres. Sécurité: pas de consommateurs aura jamais de référence .dll uniquement (c'est à dire qu'ils seront toujours à construire à partir de la source à CHAQUE FOIS), dangereux: les consommateurs n'ont pas la moindre idée de quand le code source de votre assemblée avec la const définie, elle bascule. Elle doit probablement être beaucoup plus claire .NET documentation constante signifie que vous ne pouvez pas modifier la valeur dans le code source
Pour cette raison, j'avais recommandons fortement de ne pas utiliser des constantes et au lieu de simplement faire le widget en lecture seule. Combien de valeurs peut-on vraiment dire que certains sont vraiment va être const pour toujours et toujours?
La seule vraie raison d'utiliser const plus readonly dans mon esprit est si quelque chose pourrait avoir des implications sur les performances... mais si vous êtes en cours d'exécution dans que, je me demande si C# est vraiment la bonne langue pour votre problème. En bref, pour moi, c'est alomst jamais une bonne idée d'utiliser des constantes. Il y a très peu de fois où la petite perf amélioration vaut la peine de les problèmes potentiels.