Olá.
Qualquer código-fonte é passível de revisão, consertos e melhorias. Na maioria das vezes, na minha opinião, estas alterações (ou refatorações, se preferir) são auto-contidas e transparentes, em outras vezes isto não é possível. Por exemplo, quando um método tem seu comportamento interno alterado porém tanto sua assinatura quanto seu retorno continuam com os mesmos tipos, pode-se dizer que esta alteração foi transparente pois quaisquer outras classes/métodos que o consumam não são afetados.
Em outras vezes pode ser necessário modificar a assinatura do método ou a sua saída. Os motivos variam, claro, mas pode acontecer de se estar melhorando a legilibidade do método, ou eliminando "números mágicos" ou simplesmente porque a mesma funcionalidade do método já existe em outra classe. Por exemplo, durante a revisão de um código-fonte encontra-se um método como o abaixo:
public string InserirUsuario(string nome, int idade, int tipoDeSexo) {...}
O parâmetro tipoDeSexo é do tipo inteiro mas quais números inteiros recebe? Se não houver documentação, talvez seja necessário ler o código para descobrir que 1 é igual a masculino e 2 é igual a feminino. Por outro lado, informações deste tipo são melhores representadas por enumerações. Partindo daí há duas possibilidades:
-
Criar uma enumeração, alterar a assinatura do método trocando o parâmetro inteiro tipoDeSexo pela enumeração e alterar a chamada do método em todos os locais do código-fonte;
-
Criar uma enumeração, criar um novo método com a assinatura refeita, mover a implementação do primeiro método pro segundo e marcar o primeiro método como "obsoleto".
A implementação do item 2 ficaria mais ou menos assim:
public enum TiposDeSexo {Masculino = 1, Feminino = 2}
[Obsolete("Esta versão do método está obsoleta. Utilize a 2a versão deste método.")]
public string InserirUsuario(string nome, int idade, int tipoDeSexo) { return(InserirUsuario(nome, idade, (TiposDeSexo)tipoDeSexo))); }
public string InserirUsuario(string nome, int idade, TiposDeSexo tipoDeSexo) { ... }
A vantagem de se criar um novo método é não ter que alterar todo o código-fonte buscando todos os locais que chamam o método InserirUsuario passando um inteiro para o parâmetro tipoDeSexo. Isto poderá ser feito aos poucos e cada caso de uma vez. Mantem-se a compatibilidade com todo o código, o que é bom. Ao mesmo tempo, o método foi marcado como "obsoleto". Isto significa que em todas as vezes que alguém precisar utilizar o método InserirUsuario será notificado de que a 1a versão do método está antiga e não deveria mais ser utilizada. No futuro, depois que todas as chamadas para a 1a versão do método tiverem sido alteradas para a 2a, o método em si pode ser removido do código-fonte. Muito bom, certo?
Dei toda essa volta pra informar que a MS possui um site que informa uma lista de todas as APIs do .NET Framework 2.0 que foram marcadas como obsoletas. Esta página informa também as APIs substitutas que você pode utilizar e, principalmente, quais APIs não possuem substitutas (ou seja, a API "estacionou" em termos de evolução de código).
Ainda que uma API esteja marcada com o atributo "[Obsolete]" você é livre para continuar utilizando. O único inconveniente é que o compilador gera avisos ("warnings") para cada linha de código que utilizar uma API obsoleta. Dependendo da quantidade de ocorrências a lista pode encher a paciência.
O site é este aqui. É possível visualizar a listagem por assembly (dll) ou por namespace (o que é mais legal).
Eduardo.