Pergunta

Colocar de forma diferente:

Existe uma boa razão para escolher uma coleção com tipo livre em vez de uma com tipo seguro (HashTable vs.Dicionário)?Eles ainda estão lá apenas para compatibilidade?

Pelo que entendi, as coleções genéricas não são apenas seguras para o tipo, mas seu desempenho é melhor.


Aqui está um artigo abrangente sobre o assunto: Um exame extensivo de estruturas de dados usando C# 2.0.

Foi útil?

Solução

As coleções não genéricas são tão obsoletas que foram removidas do CoreCLR usado no Silverlight e no Live Mesh.

Outras dicas

Também há problemas com a visibilidade do COM - a interoperabilidade COM não pode ser usada com genéricos

No futuro, apenas coleções genéricas deverão ser usadas.Há também o benefício de evitar boxing/unboxing de tipos da coleção.Isso é ineficiente, especialmente quando você tem uma coleção de tipos de valores que são convertidos em System.Object quando armazenados na coleção, armazenando assim os valores no heap em vez da pilha de chamadas.

Com relação ao uso de coleções não genéricas para armazenar coleções heterogêneas de coisas, você sempre pode usar List<object> para realizar a mesma coisa.Só por esta razão, eu diria que quase não há razão alguma para tocar novamente nas coleções não genéricas.

A exceção a isso seria manter a compatibilidade com sistemas escritos em outras linguagens ou com versões anteriores do .NET framework, mas esse é um caso bastante "nervoso", se você me perguntar.

Posso dizer que a serialização XAML de coleções depende da implementação de IList ou IDictionary, portanto, coleções não genéricas estarão conosco por algum tempo.

Eu não diria que estão obsoletos ou que serão removidos em breve.É verdade que você deve evitar usar coleções não genéricas, a menos que tenha um motivo não não use uma versão genérica.Milhares de linhas de código legado (não tão legado) ainda estão circulando (e continuarão por anos) que suportam coleções não genéricas, como ArrayLists.Como estes eram os apenas coleções no .NET 1.0 e 1.1, ele tem sido amplamente utilizado (e abusado) ao longo do ano.

Ocasionalmente, ainda preciso interagir com um mapeador O/R antigo escrito em .NET 1.1 que retorna objetos IList.Tenho um método que faz a conversão para um List<> genérico, o que não é eficiente, mas é assim mesmo.

E se você precisar armazenar objetos diferentes no mesmo array (estranho, mas possível), você vai precisa de uma coleção não genérica.A penalidade do Boxing e Unboxing é algo que você terá que pagar de qualquer maneira.

Não tenha medo de usá-los se achar necessário.

Pode haver casos em que você precise armazenar objetos de tipos desconhecidos ou objetos de vários tipos diferentes, mas se você realmente conhece o tipo de objetos que deseja armazenar, não vejo razão para não usar a versão genérica.

Editar:Como comentado você pode apenas usar List<Object> - ah!

Sim, pelo que entendi, eles existem apenas para compatibilidade com produtos existentes.Você deve sempre usar a versão de tipo seguro (ou seja,use System.Collections.Generic em vez de System.Collections).

http://msdn.microsoft.com/en-us/library/ms379564.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top