Partilhar via


Como as alterações de código podem afetar a compatibilidade

Compatibilidade refere-se à capacidade de compilar ou executar código em uma versão de uma implementação .NET diferente daquela com a qual o código foi originalmente desenvolvido. Uma alteração específica pode afetar a compatibilidade de seis maneiras diferentes:

Mudança comportamental

Uma mudança comportamental representa uma mudança no comportamento de um membro. A alteração pode ser visível externamente (por exemplo, um método pode lançar uma exceção diferente), ou pode representar uma implementação alterada (por exemplo, uma alteração na forma como um valor de retorno é calculado, a adição ou remoção de chamadas de método interno ou até mesmo uma melhoria significativa de desempenho).

Quando as mudanças comportamentais são visíveis externamente e modificam o contrato público de um tipo, elas são fáceis de avaliar, pois afetam a compatibilidade binária. As alterações na aplicação são muito mais difíceis de avaliar; dependendo da natureza da alteração e da frequência e padrões de utilização da API, o impacto de uma alteração pode variar de grave a inócuo.

Compatibilidade binária

Compatibilidade binária refere-se à capacidade de um consumidor de uma API usar a API em uma versão mais recente sem recompilação. Alterações como adicionar métodos ou adicionar uma nova implementação de interface a um tipo não afetam a compatibilidade binária. No entanto, remover ou alterar as assinaturas públicas de um assembly para que os consumidores não possam mais acessar a mesma interface exposta pelo assembly afeta a compatibilidade binária. Uma alteração deste tipo é denominada uma alteração binária incompatível.

Compatibilidade de fontes

A compatibilidade de origem refere-se à capacidade dos consumidores existentes de uma API de recompilar em relação a uma versão mais recente sem quaisquer alterações na fonte. Uma alteração de origem incompatível ocorre quando um consumidor precisa modificar o código-fonte para que ele seja compilado com êxito em relação a uma versão mais recente de uma API.

Compatibilidade em tempo de design

A compatibilidade em tempo de desenvolvimento refere-se à preservação da experiência em tempo de desenvolvimento em versões de Visual Studio e outros ambientes de desenvolvimento. Embora isso possa envolver o comportamento ou a interface do usuário dos designers, o aspeto mais importante da compatibilidade em tempo de design diz respeito à compatibilidade do projeto. Um projeto ou solução deve poder ser aberto e usado em uma versão mais recente do ambiente de tempo de design.

Compatibilidade com versões anteriores

A compatibilidade com versões anteriores refere-se à capacidade de um consumidor existente de uma API de executar uma nova versão enquanto se comporta da mesma maneira. Tanto as alterações comportamentais como as alterações na compatibilidade binária afetam a compatibilidade com versões anteriores. Se um consumidor não puder executar ou se comportar de forma diferente ao executar em relação à versão mais recente da API, a API será incompatível com versões anteriores.

As alterações que afetam a compatibilidade com versões anteriores são desencorajadas, uma vez que os desenvolvedores esperam compatibilidade com versões anteriores em versões mais recentes de uma API.

Compatibilidade direta

Compatibilidade futura refere-se à capacidade de um consumidor existente de uma API de funcionar com uma versão mais antiga enquanto exibe o mesmo comportamento. Se um consumidor não puder executar ou se comportar de forma diferente quando executado em uma versão mais antiga da API, a API encaminhará incompatível.

A manutenção da compatibilidade futura praticamente elimina quaisquer alterações ou adições de versão para versão, uma vez que essas alterações impedem que um consumidor que visa uma versão posterior seja executado numa versão mais antiga. Os desenvolvedores esperam que um consumidor que depende de uma API mais recente pode não funcionar corretamente em relação à API mais antiga.

Manter a compatibilidade futura não é um objetivo de .NET.NET Aspire.