L'uso della const e' molto chiaro a tutti, in pratica definiamo una variable con un valore e vogliamo che tale valore rimanga immutabile nel tempo. Se leggiamo bene la documentazione, riscontriamo degli effetti potenzialmente indesiderati. Ed in particolare va prestata molta attenzione alla seguente frase”A constant expression is an expression that can be fully evaluated at compile time.”.
Che cosa significa esattamente? Significa che chi fa uso della costante non avra' un riferimento alla variabile, ma il valore della costante verra' copiato AS IS durante la compilazione. Se per qualche motivo, durante lo sviluppo, cambiamo il valore della costante (refactoring?) diventa necessario ricompilare tutti gli assembly che ne fanno uso.
Fin quando implementiamo la nostra applicazione da zero probabilmente non e' un problema, ma se lavoriamo su delta (es patch e servce pack), allora arrivano i problemi. Infatti non e' detto che quando installeremo la nostra patch andremo a sostituire tutti gli assembly, ma solamente cio' che avremo cambiato...quindi introduciamo potenzialmente altri bug!
La soluzione qual'e'? Sostanzialmente non usare mai il modifier public o protected con le const, ma solo con internal e private. Infatti, all'interno dell'assembly questo effetto viene neutralizzato in quanto non e' possibile compilare solo una parte di assembly (a meno di non fare accrocchi). Negli altri casi e' meglio usare static readonly al posto delle const.
Un'ultima nota, l'uso del modificatore internal puo' essere anch'esso pericoloso per via degli assembly friend. Se ne fate uso, evitate le internal const.