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

Alterar cores do PageControl (Delphi)

O padrão Windows todo cinza não é muito atraente, por isso quando nos utilizarmos do PageControl podemos alterar suas cores e fontes da seguinte maneira: Em primeiro lugar devemos alterar a propriedade OwnerDraw para TRUE ; Depois implementar seu método DrawTab da seguinte maneira: //pinta a fonte Control.Canvas.Font.Color:=clBlack; // // pinta a paleta / aba Control.Canvas.brush.Color:=clSkyBlue; PageControl1.Canvas.Rectangle(Rect); Control.Canvas.TextOut(Rect.left+5,Rect.top+3,PageControl1.Pages[tabindex].Caption); // pinta a parte interna (tabsheet) PageControl1.Pages[TabIndex].brush.Color := Control.Canvas.brush.Color; PageControl1.Pages[TabIndex].Repaint; Caso a intenção seja manter cada aba com seu próprio estilo basta adicionar um CASE filtrando o índice das abas: case TabIndex of   0: Control.Canvas.Font.Color:=clBlack;   1: Control.Canvas.Font.Color:=clWindow; ...

Manipular arquivos com PL/SQL (Oracle)

O bom e velho arquivo, é impressionante como lidamos com seus vários tipos durante todos os dias, bom hoje vamos mostrar um jeito simples de se escrever e ler arquivos apenas com a codificação nativa do Oracle. A primeira coisa a fazer é criar um diretório válido configurado no Oracle, e permissões de acesso a esse diretório para o usuário de banco onde faremos o exemplo, sendo assim suponhamos que nosso usuário de banco se chame programero, e nosso diretório real esteja em c:\programero, então logado como SYSTEM devemos executar os seguintes comandos: 1: -- cria diretorio 2: create or replace directory DIR_PROGRAMERO as ' C:\PROGRAMERO '; 3: -- concede permissão de escrita e leitura para nosso usuário 4: grant read , write on directory DIR_PROGRAMERO to PROGRAMERO; Para escrever, basicamente precisamos apenas saber onde esse arquivo ficará, no nosso caso no diretório criado acima, segue o código de escrita: 1: declare 2: -- nosso handler 3: v_a...

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...