Pergunta

Eu nunca usei qualquer dos genéricos .NET no meu trabalho, mas eu entendo que eles são bastante popular. Alguém tem alguma boas ligações ou sugestões de livros para aprendê-las? Como um bônus; Eu apenas vagamente entender o .NET coleções genéricas são eo que fazem ... alguém tem alguma exemplos práticos de como eles podem ser usados ??para uma maior vantagem que as coleções normais em .NET?

Outras dicas

A escolha óbvia ..

MSDN C # genéricos

CLR via C # por Jeffrey Richter se aprofunda sobre os genéricos, e é um dos recursos inestimáveis ??todo desenvolvedor .NET deve possuir e ler.

Se você já usou modelos C ++, em seguida, os genéricos .Net são quase a mesma coisa. Eles ainda usam uma semelhante sintaxe.

Mesmo se você não sabe qualquer C ++ você provavelmente está fazendo isso mais difícil do que você precisa, especialmente em relação às coleções. Eles são como qualquer outra coleção, mas quando você criá-los você fornecer um nome do tipo dentro do <<> 's para que o compilador sabe que tipo de item que segurar.

C # 3.0 in a Nutshell é um livro de referência fantástico com exemplos apenas grande enought para entender o conceito sem sentir inchado.

Eu encontrei genéricos Professional .NET 2.0 da Wrox muito útil, pois contém grande quantidade de exemplos do mundo real. Genéricos poderia ser confuso para o iniciante, mas eles poderiam ser uma poderosa ferramenta muito útil / / economia de tempo nas mãos de um desenvolvedor experiente. Pessoalmente, acho .NET genéricos mais útil para simplificar o uso da definição e das coleções. Além disso, o uso de genéricos poderia levar a um código mais eficiente quanto poderia minimizar o desempenho hit geralmente associado com conversões de boxe / unboxing tipo.

É melhor seguir um treinamento Microsoft sobre o assunto. Se você está à procura de livros, o seguinte seria o ideal:

http://www.microsoft.com/MSPress/books/9469.aspx

O meu voto é-na maior parte você pode simplesmente evitá-los :)

A principal vantagem dos genéricos é salvar casting, se você acabar fazendo lançando internamente que não faz qualquer sentido. Se você tentar olhar para esta questão você descobriu que a maioria dos candidatos para os genéricos são realmente essas coleções / conjuntos que poderiam criar armazenamento nativo internamente para tal benefício. A maioria dos outros componentes, por outro lado, o ganho pouco / nenhum desempenho, e degrada a flexibilidade comparando de forma significativa para uma implementação de herança interface.

Se lançando irrita tanto, talvez tempo para você considerar linguagens dinâmicas como IronPython:)

E- se você realmente se deparar com um cenário que você acha que faz sentido genérico, postá-lo como uma outra pergunta, os cérebros aqui poderia olhar juntos e resolvê-lo caso a caso:)

Update: Yep compilador verificação é bom, mas verifique fonte do Castelo Projeto, você pode ver muitas situações em que um tipo genérico entra no caminho, porque você não pode fazer casting- fazendo coisas como IBusinessObject é muito mais flexível do que BusinessObject- porque você não pode lançar algo herdam BusinessObject volta para BusinessObject e espera para aceder a uma função herdada. Normalmente código serra eu acabar como BusinessObjectBase -> BusinessObject -> Sua classe real. É por isso que eu meio que sinto que não é sempre benéfico para usar generics- e eu era um daqueles que fizeram abuso de tal implementação e acabam por ter de toneladas de função engraçado com tipagem genérica, não Nice.

Atualização # 2: Boxe / Unboxing apenas significa a exigência de converter o objeto quando você usa um tipo abstrato (como objeto) ao valor de armazenar e utilizar um forte valor digitado para armazená-lo de volta (que requer seleção de elenco), não muito diferença que eu posso ver para além da recolha situação afirmei. E código como este ainda faz boxe:

public T GetValue<T>() {
  return (T) ...;
}

Isso é o abuso genérico que tenho visto na maioria das vezes. As pessoas pensam que eles estão lidando com tipo nativo aqui, na verdade eles não são. Em vez disso, basta fazer o casting para sintaxe genérica. O que realmente faz sentido é o seguinte:

public class MyList<T>
{
  private List<T> _list;
...
public T GetValue(int index)
{
  return _list[index];
}

Então isso é novamente de volta ao nosso armazenamento de coleção. É por isso que eu disse após o armazenamento coleção não vejo muita chance de genéricos ajuda. Referido a partir deste tutorial: http://en.csharp-online.net/Understanding_Generics-Revisiting_Boxing_and_Unboxing

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