Pular para o conteúdo principal

C# - Tipos genéricos

A linguagem C# introduziu a funcionalidade de tipos genéricos com a versão 2.0, permitindo que desenvolvedores escrevam código mais flexível e reutilizável. Os tipos genéricos permitem que você escreva uma classe ou método que funciona com qualquer tipo de dados, em vez de estar preso a um tipo específico. Isso permite que o código seja escrito de forma mais genérica, o que aumenta a sua reutilização.


Para entender melhor, vamos dar um exemplo de uma classe simples para gerenciar uma lista de objetos. Sem o uso de tipos genéricos, seria necessário escrever uma classe para cada tipo de objeto que desejássemos gerenciar. Por exemplo, uma classe "ListaDeInteiros", outra "ListaDeStrings", e assim por diante. Com o uso de tipos genéricos, é possível escrever uma única classe "Lista<T>" onde T é o tipo genérico. Isso significa que a classe pode ser usada para gerenciar uma lista de qualquer tipo de objeto, sem precisar escrever uma classe específica para cada tipo.


A sintaxe para criar uma classe genérica é simples, basta adicionar um identificador dentro dos sinais de menor/maior o nome da classe, como no exemplo abaixo:

    
        class Lista<T> {
                // ...
        }
    

E para utilizar essa classe, é necessário especificar o tipo que deseja utilizar, como no exemplo abaixo:

    
        Lista<int> minhaListaDeInteiros = new Lista<int>();
        Lista<string> minhaListaDeStrings = new Lista<string>();
    

Além de classes, também é possível criar métodos genéricos. A sintaxe é semelhante, basta adicionar um identificador genérico dentro dos sinais de menor/maior  após o nome do método, como no exemplo abaixo:

    
        class MinhaClasse {
            public T MetodoGenerico<T>(T valor) {
                // ...
            }
        }
    

Os tipos genéricos também possuem restrições, é possível restringir o tipo genérico a uma classe base ou interface específica, ou especificar que o tipo genérico deve ter um construtor sem parâmetros.


Mais exemplos

Criando uma classe genérica de pilha (Stack) que pode armazenar qualquer tipo de dado:

    
        class Stack<T>
        {
            private T[] _items;
            private int _count;
        
            public void Push(T item)
            {
                _items[_count++] = item;
            }
        
            public T Pop()
            {
                return _items[--_count];
            }
        }        
    

Usando o tipo genérico "T" para especificar o tipo de dado de uma lista:

    
        List<int> numbers = new List<int>();
        numbers.Add(1);
        numbers.Add(2);        
    

Criando uma interface genérica para comparação de objetos:

    
        interface IComparer<T>
        {
            int Compare(T x, T y);
        }
    >

Usando tipo genérico para definir métodos genéricos

    
        void Swap<T>(ref T a, ref T b)
        {
            T temp = a;
            a = b;
            b = temp;
        }        
    

Usando tipos genéricos em expressões lambda e delegações

    
        Func<T, bool> filter = x => x > 0;
    

Conclusão

O uso de tipos genéricos é amplamente utilizado pela comunidade e oferece um grande poder de abstração e reutilização para nosso trabalho, utilize sem moderação ;-]

Comentários

Mais visitadas

Como Verificar se um Objeto Existe (Delphi)

Em alguns momentos surge a necessidade de verificar se um determinado objeto existe, ou seja se já foi criado, principalmente quando se trabalha com criação dinâmica em tempo de execução, então vamos ao exemplo: - Vamos criar uma variável, um vetor do tipo caixa de texto: var Minha_caixa : array of TEdit; - Em seguida definir o tamanho desse vetor, no caso será dez: setLength(Minha_caixa, 10) - Agora iremos criar nossa caixa de texto: // lembrando que o vetor inicia em zero // logo o índice final é o tamanho total - 1 for vl_i := 0 to Length(Minha_caixa) -1 do begin Minha_caixa[vl_i] := TEdit.Create(self); with Minha_caixa[vl_i] do begin Parent := Self; Name := 'Caixa_N'+IntToStr(vl_i); Text := 'Esta é a '+IntToStr(vl_i)+' º caixa !'; ReadOnly := true; Height := 21; Width := ...

Palavra com a primeira letra em Maiúsculo (Delphi)

Para casos onde temos palavras que são armazenadas todas em maiúsculo, geralmente surge a necessidade de utiliza-la de uma maneira mais elegante, como o título sugere, então vamos lá: function Primeira_Letra_Maiuscula(p_texto: string): string; begin IF p_texto <> '' THEN result := UpperCase(Copy(p_texto,1,1))+LowerCase(Copy(p_texto,2,Length(p_texto))); end;

Iniciar e Parar Serviços do Windows (Delphi)

Em certas ocasiões nos deparamos com a necessidade de manipular determinadas atividades do SO, como iniciar ou parar um banco de dados, ou qualquer outro serviço que esteja funcionando no momento. Segue abaixo um código que encontrei na Internet para tal finalidade (não me recordo à fonte, assim que eu a encontrar colocarei). Iniciar Serviço: uses WinSvc; // // start service // // return TRUE if successful // // sMachine: //   machine name, ie: \SERVER //   empty = local machine // // sService //   service name, ie: Alerter // function ServiceStart(   sMachine,   sService : string ) : boolean; var   //   // service control   // manager handle   schm,   //   // service handle   schs   : SC_Handle;   //   // service status   ss     : TServiceStatus;   //   // te...