Adicionar valores enum quebra a compatibilidade binária?
-
13-12-2019 - |
Pergunta
Imagine este enum em uma DLL.
public enum Colors
{
Red,
Green
}
Adicionar valores enum quebra a compatibilidade binária?Se eu mudasse, os EXEs existentes quebrariam?
public enum Colors
{
Red,
Green,
Blue
}
Eu vi esta resposta, mas parecia abordar o caso de inserindo um valor.Se eu adicionar valores a o fim apenas, está tudo bem?
Solução
Não, isso não quebra a compatibilidade binária (na medida em que:o assembly ainda será carregado, etc.), porque enums são basicamente constantes literais inteiras.Inserir valores no meio é obviamente uma ideia muito perigosa, mas você já excluiu isso.
No entanto, isso pode causar uma série de outros problemas contra os quais você precisa se proteger:
- algum código (
switch
declarações em particular) podem não antecipar os novos valores;tecnicamente, isso também era um problema antes, já que enums não são verificados por valor (variáveis enum podem conter valores indefinidos) - qualquer coisa que consulte as enumerações disponíveis obterá resultados diferentes
- em particular, a serialização e a desserialização poderão falhar inesperadamente se houver dados usando enums que ainda não são esperados pelo cliente específico
Outras dicas
Deve ficar tudo bem, supondo que você acrescente apenas no final.Porém, o risco de quebra viria do fato de os valores enum serem definidos implicitamente, começando em 0.Portanto, se alguém persistir os valores em um banco de dados, você corre o risco de alterar os valores para os quais eles mapeiam.
Por exemplo, se você alterou seu enum para:
public enum Colors
{
Blue,
Red,
Green
}
Qualquer pessoa que armazenasse esses valores em seus bancos de dados veria que coisas que antes eram vermelhas, agora são azuis, e o que era verde agora é vermelho.
Idealmente, você deve definir seu enum assim:
public enum Colors
{
Red = 0,
Green = 1
}
E então, ao adicionar um novo, você deverá ter:
public enum Colors
{
Red = 0,
Green = 1,
Blue = 2
}
Isso ajudará a evitar possíveis problemas de versão.