Tag Archives: const

C# – static readonly vs. const

C#
O pessoal do grupo em que participo colocou essa pergunta e achei bacana comentar aqui.

Qual a diferença entre utilizar static readonly ou const ? Tem algum
que é mais performatico?

const é avaliado em tempo de compilação, enquanto static readonly em tempo de execução. Isso permite que no static readonly você inicialize uma classe ou struct, enquanto no const você só pode usar tipos primários (porque são compilados).

O readonly pode ser inicializado dentro do construtor. Ou seja, dependendo do construtor que você usar, o readonly pode ter valores diferentes. Já o const não. Mas isso só vale pra readonly non-static, pq só existe um construtor static pra classe.

Tem mais um fator, muito importante aliás, principalmente na utilização de componentes.

Em quase todas as linguagens, const é apenas um facilitador para substituição de valores. Quando você declara um const e atribui um valor a ele, por exemplo, um inteiro de valor 5, ao compilar, todos os lugares que referenciam sua const vão ter o valor substituído pelo inteiro 5. Por isso a performance.

No caso do static reanonly, isso não acontece pois, apesar da variável ser somente leitura, ela ainda é uma “variável” e sempre será referenciada.

Um caso típico de onde não se deve usar const é em bibliotecas. Por exemplo, você criar uma lib que vai conter a string de conexão. Você a coloca em uma const. Na compilação, todos os valores que refenciam a
string de conexão terão seus valores substituídos pelo valor da const. Ok, era o que você queria. Mas, caso você preciso alterar a string de conexão, você obviamente vai recompilar e publicar somente a lib com a
informação. O fato é, ao fazê-lo, todo o resto do código só conhece o valor anterior da const.

Para ver um exemplo bem simples, crie o seguinte programa no notepad mesmo:

1
2
3
4
5
6
7
8
9
10
11
using System;
 
public class TestConst
{
        public static void Main(string[] args)
        {
                const string MinhaString = "bla";
                Console.WriteLine(MinhaString);
        }
 
}

Compile com o csc.exe. Em seguida, abra o assembly com o ILDASM ou mesmo o Reflector. Veja o resultado.