Generics na prática


por Mauricio Junior em 1/1/2011 0

 

 

Com a ferramenta lançada pela Microsoft, surgiram também alguns métodos novos e uma nova maneira para criar uma lista de dados. Nós chamamos de Generics. Generics é uma característica na versão do framework . NET 2.0 dentro do runtime CLR, com o conceito de parâmetros no qual cria a possibilidade de designer classes e métodos. A especificação de um ou mais tipos, até classe ou método que for declarado e instanciado pelo código do cliente. Por exemplo, usando um genérico do tipo parâmetros T, você pode escrever uma simples classe que outros códigos clientes possam utilizar sem gerar custo ou risco do runtime casts ou operações boxing.

 

Coleções

 

Com o Generics abre a possibilidade de trabalhar com coleções e realmente utilizar orientação a objetos. Sistema orientado a objetos é muito mais do que apenas classes e métodos. O namespace que preciso importar ao meu projeto é a System.Collections.Generics. O .NET 2.0 veio para resolver os problemas anteriores em relação a coleções.

 

 

Na prática

 

O código (referência generics.1.1) é um exemplo que mostra como gerar uma classe generic GenericList<T> que contém uma listas de inteiros. Simplesmente mudando o tipo de argumento, o código da referência (generics.1.1) poderá ser facilmente modificado para criar listas de strings ou várias outros tipos customizados.

 

 

 

//importes

using System.Collections.Generics

 

class TesteList

{

    static void Main()

    {

        // int is the type argument

        GenericList<int> lista = new GenericList<int>();

 

        for (int x = 0; x < 10; x++)

        {

            lista.AddHead(x);

        }

 

        foreach (int i in lista)

        {

            System.Console.Write(i + " ");

        }

        System.Console.WriteLine("\nDone");

    }

}

Referência: Generics.1.1

 

No exemplo, mostra claramente uma lista sendo preenchida e mais abaixo escrita no console. Uma lista pode ser fortemente “tipada” de acordo com a sua classe gerada, ou seja, no sistema possui uma classe do tipo “Usuario", pode ser feito uma lista desse tipo e preenchido de uma forma fácil, rápida e prática.

 

O próximo exemplo gerará uma lista do tipo “Usuario”, logo após pegar os dados do banco e preenche-la.

 

Seguindo, cliquei com o botão direito em cima do projeto e adicionei um nova classe com o nome Usuario.cs. Gerei três propriedades, uma do tipo int e o restante string. (Referência: Generics.1.2)

 

 

 

 

    private int _chave;

    private string _nome;

    private string _email;

 

Referência: Generics.1.2

 

Depois de gerar as propriedades, utilizei a tela de atalho CTRL + R em seguida CTRL + E, essas teclas de atalho servem para gerar Get e Set das propriedades.

Caso não queira usar as teclas de atalho, basta utilizar o menu Refactor e escolher a opção Encapsulate Field... (Referência Generics.1.3)

 

 

Referência: Generics.1.4

 

 

A referência Generics.1.5 mostra o código gerado na classe Usuario.cs.

 

 

    public string Email

    {

        get { return _email; }

        set { _email = value; }

    }

 

    public string Nome

    {

        get { return _nome; }

        set { _nome = value; }

    }

 

    public int Chave

    {

        get { return _chave; }

        set { _chave = value; }

    }

 

Referência: Generics.1.5

 

 

Mostrarei um exemplo básico conectando no banco de dados e preenchendo a lista do tipo Usuario. Gerei uma página .ASPX com o nome Generics.aspx. Na parte HTML, adicionei um componente GridView com o nome gridView. (Referência Generics.1.6)

 

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Generics.aspx.cs" Inherits="Generics" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Generics</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:GridView ID="gridView" runat="server">

           

        </asp:GridView>

    </div>

    </form>

</body>

</html>

 

Referência: Generics.1.6

Não acrescentei nada dentro do gridview criado anteriormente. Passando para o código Generics.aspx.cs, criei o método getUsuario() que retorna uma lista de usuários. Criei a conexão, fiz o select, abri o banco de dados com o comando Open(). Criei uma lista de usuário, executei o ExecuteReader(), adicionei a um while o datareader criado e por final fui adicionando na lista. Depois que adicionei na lista retornei-a. Veja o código. (Referência Generics.1.7)

 

 

 

private List<Usuario> getUsuario()

    {

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))

        {

            using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))

            {

                conn.Open();

                List<Usuario> listUsu = new List<Usuario>();

                using (SqlDataReader dr = command.ExecuteReader())

                {

                    while (dr.Read())

                    {

                        Usuario usuario = new Usuario();

                        usuario.Chave = (int)dr["chave"];

                        usuario.Nome = (string)dr["nome"];

                        usuario.Email = (string)dr["email"];

                        listUsu.Add(usuario);

                    }

                }

                return listUsu;

            }

        }

    }

Referência: Generics.1.7

 

 

 

Explicação:

 

Note que depois de abrir o banco de dados, gerei um List<Usuario>. Esse <Usuario> é o nome de minha classe, ou seja, estou “tipando” a minha lista para o tipo da classe Usuario.cs que possui apenas propriedades get e set.

Executei o comando ExecuteReader() e logo abaixo criei um laço enquanto a variável “DataReader” tiver dados.

 

Dentro do “while”, criei uma nova variável da classe “Usuario” criada anteriormente e fui adicionando o valor do “DataReader” dentro da variável criada Usuario com suas respectivas propriedades.

 

 

 

   Usuario usuario = new Usuario();

   usuario.Chave = (int)dr["chave"];

   usuario.Nome = (string)dr["nome"];

   usuario.Email = (string)dr["email"];

 

Referência: Generics.1.8

 

 

No fim do while pego a lista e uso o “Add” passando o “usuario”. Dessa forma, os valores são adicionados na lista.

 

 

                   while (dr.Read())

                    {

                        Usuario usuario = new Usuario();

                        usuario.Chave = (int)dr["chave"];

                        usuario.Nome = (string)dr["nome"];

                        usuario.Email = (string)dr["email"];

                        listUsu.Add(usuario);

                    }

Referência: Generics.1.9

 

Ao fim de tudo, retorno a lista preenchida.

 

return listUsu;

 

Referência: Generics.1.10

 

 

No método Page_Load, atribui o resultado do método ao DataSource do gridview, em seguida usei o DataBind(). Para não confundir, segue o código de toda página .cs. (Referência Generics.1.11)

 

 

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

 

//importes

using System.Collections.Generic;

 

public partial class Generics : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        this.gridView.DataSource = getUsuario();

        this.gridView.DataBind();

    }

 

    private List<Usuario> getUsuario()

    {

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))

        {

            using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))

            {

                conn.Open();

                List<Usuario> listUsu = new List<Usuario>();

                using (SqlDataReader dr = command.ExecuteReader())

                {

                    while (dr.Read())

                    {

                        Usuario usuario = new Usuario();

                        usuario.Chave = (int)dr["chave"];

                        usuario.Nome = (string)dr["nome"];

                        usuario.Email = (string)dr["email"];

                        listUsu.Add(usuario);

                    }

                }

                return listUsu;

            }

        }

    }

}

 

Referência: Generics.1.11

 

 

A única especificação não mostrada foi o banco de dados. Segue. (Referência Generics.1.12).

 

 

Referência: Generics.1.12

 

 

Resultado final. (Referência Generics.1.13)

 

 

Referência: Generics.1.14

 

 

Bom, fico por aqui, espero que tenha gostado e aprendido um pouco.  Qualquer dúvida, favor entrar em contato pelo e-mail mauricio@aspneti.com.

 

 

Livros publicados:

 

 

 

Maurício Junior

www.aspneti.com

www.mauriciojunior.org

 

voltar   comente  subir

 
Mauricio Junior Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; .
Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna. Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, ECODE10.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A. Blog: blog.mauriciojunior.org, Site pessoal www.mauriciojunior.org



Comentários:
Comentado por: Alekcey - 20/8/2006 15:42:23
este eh um texto traduzido???
Comentado por: Mauricio Junior - 20/8/2006 15:50:40
Olá Alekcey, respondendo sua pergunta: não é um texto traduzido. Espero que esteja gostando do artigo.

Comente (dê sua opinião):
Comentário:
Código Imagem:  (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

 

Outros Artigos do Autor

Problemas na acentuação
VSTS 2008
Deixando o rodapé fixo
ASPNETi no seu celular
My Tracks
Virtual Earth - Segundo Passo
SQL Dinâmico Compilado
Chart - novo componente integrado Visual Studio .NET 2010
Vídeo - Sistema de Atendimento de Clientes
Apresentação do Windows
Vídeo: Imagem Efeito
Sistema de Login em ASP – Parte II
ListBox componente básico
VS 11 preparado para HTML 5
Page.Header
O futuro da tecnologia com a Microsoft
IsAlphaNumeric
As várias maneiras de mandar e-mail utilizando .NET
Vídeo: Framework de dados - parte 1
Calcular Média de Combustível
Vídeos Online Gratuitos
Orientação a Objetos com Visual Studio.NET 2005 (o famoso OO) – parte 1
Vírus - Telegrama Eletrônico
Criando a Tag Cloud em C#
Atalho novo, formatar e concatenar usando Visual Studio .NET 2010
HTMLEditorExtender com Imagem
Vídeo aula explicando o que é o FreeTextBox e como utilizar em seu projetos ASP.NET.
Adicionando Valores no ComboBox
O Avanço do Blu-Ray no Brasil
Microsoft® Expression® Web
Formatando String rapidamente
Vídeo Microsoft Visual SourceSafe Parte III 3/3
WebService - Desenvolvimento Parte 1
Criando XML a partir de um DATASET tipado – Parte II
Sistema de Login em ASP – Parte III