Se uma entidade for imutável, a questão de usar uma estrutura ou uma classe geralmente será de desempenho, e não de semântica. Em um sistema de 32/64 bits, as referências de classe requerem armazenamento de 4/8 bytes, independentemente da quantidade de informações na classe; copiar uma referência de classe exigirá a cópia de 4/8 bytes. Por outro lado, todos os distintosA instância de classe terá 8/16 bytes de sobrecarga, além das informações que ela contém e do custo de memória das referências a ela. Suponha que se queira uma matriz de 500 entidades, cada uma contendo quatro números inteiros de 32 bits. Se a entidade for um tipo de estrutura, a matriz exigirá 8.000 bytes, independentemente de todas as 500 entidades serem todas idênticas, diferentes ou em algum lugar intermediário. Se a entidade for do tipo classe, a matriz de 500 referências ocupará 4.000 bytes. Se todas essas referências apontarem para objetos diferentes, os objetos exigiriam 24 bytes adicionais cada (12.000 bytes para todos os 500), um total de 16.000 bytes - o dobro do custo de armazenamento de um tipo de estrutura. Por outro lado, do código criou uma instância de objeto e copiou uma referência para todos os 500 slots da matriz, o custo total seria de 24 bytes para essa instância e 4, 000 para a matriz - um total de 4.024 bytes. Uma grande economia. Poucas situações funcionariam tão bem quanto a última, mas, em alguns casos, pode ser possível copiar algumas referências para slots de matriz suficientes para que esse compartilhamento valha a pena.
Se a entidade deve ser mutável, a questão de usar uma classe ou estrutura é, de certa forma, mais fácil. Suponha que "Thing" seja uma estrutura ou classe que possua um campo inteiro chamado xe faça o seguinte código:
Coisa t1, t2;
...
t2 = t1;
t2.x = 5;
Alguém quer que a última declaração afete t1.x?
Se Thing for um tipo de classe, t1 e t2 serão equivalentes, ou seja, t1.x e t2.x também serão equivalentes. Portanto, a segunda instrução afetará t1.x. Se Thing for um tipo de estrutura, t1 e t2 serão instâncias diferentes, significando que t1.xe t2.x se referirão a números inteiros diferentes. Portanto, a segunda instrução não afetará t1.x.
Estruturas mutáveis e classes mutáveis têm comportamentos fundamentalmente diferentes, embora o .net tenha algumas peculiaridades no tratamento de mutações struct. Se alguém quiser um comportamento de tipo de valor (o que significa que "t2 = t1" copiará os dados de t1 para t2, deixando t1 e t2 como instâncias distintas) e se puder conviver com as peculiaridades no manuseio de tipos de valores pela .net, use uma estrutura. Se alguém quiser semântica de tipo de valor, mas as peculiaridades de .net causariam uma semântica de tipo de valor quebrada no aplicativo, use uma classe e murmure.