Css (Cascading Style Sheets) para iniciantes

O que significa a sigla CSS ?

CSS é a sigla para Cascading Style Sheet, que, em português, foi traduzido para folhas de estilo em cascata, e nada mais é do que um documento no qual são definidas regras de formatação de estilos a serem aplicadas aos elementos estruturais de marcação.

Qual é a finalidade das CSS ?

A finalidade das CSS é retirar do (X)HTML toda e qualquer declaração que vise a formatação ou á apresentação do documento. Isto significa dizer que as tags do tipo <font>, <bold>, <em>, <i> etc., bem como uso das colunas e linhas de tabelas para a obtenção de espaçamentos, não são admitidas ou admitidas com restrições em um projeto CSS. Simplificando, vale dizer: (X)HTML para estruturas e CSS para apresentar.

Por que devo usar CSS ?

CSS permite que você retire da marcação (X)HTML toda formatação ou apresentação do documento web. Quem vai determinar cores, formas, tipos e tamanhos, posicionamentos, e todo o visual da pagina são as CSS. As vantagens estão relatadas nas respostas a seguir.

Quais são as vantagens de usar CSS ?

Inúmeras são as vantagens de uso das CSS nos documentos web. Eis as principais:

  • Controle total sobre a apresentação do site e a partir de um arquivo central;
  • Agilização da manutenção de redesign do site;
  • Saída para diferentes tipos de mídia a partir de uma versão única de (X)HTML;
  • Redução do tempo de carga dos documentos web;
  • Adequação simplificada aos critérios de acessibilidade e usabilidade;
  • Elaboração de documento consistentes com as aplicações de usuários futuras;
  • Aumento considerável na portabilidade dos documentos web;

As CSS estão de acordo com as Web Standards (Padrões da Web) ?

Sim estão. As CSS estão entre as praticas vivamente recomendadas pelo W3c, para projetos web. Os esforços dos órgãos normalizadores apontam no momento atual para elaboração de documentos web acessíveis, usáveis e portáveis com grande ênfase. Além do mais, as CSS facilitam e simplificam a obtenção destas três características.

O que é Seletor ?

Seletor é uma entidade que identifica um elemento (X)HTML ou entidade do DOM, na qual a regra de estilo ser a aplicada.
Por exemplo:

p {font-size:12px;}

Seletor ‘p’ (elemento (X)HTML paragrafo) e a regra CSS determinam que os paragrafor teram uma mesma fonte de tamanho 12px.

p, ul {font-size:10px;}

Os seletores são ‘p’ e ‘ul’.

O que é seletor do tipo classe ?

São tipos de seletores que podem ser escritos em tags de documentos (X)HTML eles podem estar em uma ou mais tags (X)HTML não importando sua repetição. Exemplo:

.minhaClasse
{
color: red;
}
<p class='minhaClasse'>

ou

<a class='minhaClasse'>

ou tambem

<span class='minhaClasse'>

O que são seletores do tipo ID ?

Seletores do tipo ID são iguais seletores de classe so que não pode se repetir, pois no documento (X)HTML cada tag deve ter um ID (nome) diferente e nenhum deve ser igual, através disso podemos estilizar uma tag (X)HTML pelo seu ID também mas somente aquela tag. Por Exemplo:

#minhaClasse
{
color: red;
font-size:12px;
font-family:"Arial", Helvetica, Tahoma;
}
<span id="minhaClasse">

Neste caso acima só pode ter uma tag com esse mesmo ID no documento inteiro mesmo que seja outro tipo de tag exemplo <a>, <ul>, <img>, so podemos ter uma no documento com esse mesmo ID ou mesmo nome, sendo assim estilizamos essa tag pela classe #minhaClasse, o símbolo # antes do nome da classe indica que este deve ser o nome do ID de uma tag dentro do documento web.

Entendendo o ciclo de vida de um Form (Windows Forms)

Neste post iremos aprender como é o ciclo de vida de um Form na plataforma descktop, ou seja Windows Forms, trabalharemos com delegates, EventHandler, objetos e eventos da classe System.ComponetModel, veremos em que momento são disparados eventos em tempo de vida de um Form como Closed, Closing, Activated, e Deactivated.

Uma breve explicação sobre o que é um “delegate”

Essencialmente um delegate é um objeto com segurança de tipo, ou seja, ele aponta para um método ou possivelmente uma lista de métodos, na aplicação, e que pode ser chamado no futuro, especificadamente um objeto delegate mantem três informações importantes:

O endereço do método no qual ele faz a chamada.
Os argumentos, se houver deste método.
O valor de retorno, se houver deste método.

Observação: Os delegates na plataforma .NET pode apontar para métodos estáticos e instancias.

Um delegate em .NET possui a capacidade de chamar método de maneira sincronizada ou assíncrona. Este fato simplifica e muito as tarefas de programação, já que podemos chamar um método de uma cadeia de execução dentro de nossa aplicação (Thread = Cadeia). Breve estarei publicando um post neste blog abrangendo mais a fundo o termo delegate e thread.

Criando a Aplicação para ver o ciclo de vida do Form

Se você programou interfaces de usuário utilizando o kit de ferramentas GUI, como Java Swing, Mac OS-X, ou API bruta Win32, você esta ciente que tipos “tipo janelas” possuem uma quantidade de eventos que disparam durante seu tempo de vida. O mesmo acontece com Windows Form. Como você viu a vida útil de um formulário começa quando o construtor de tipo é chamando antes de ser passado ao método Application.Run().  Assim que o objeto é alocado na Heap gerenciado, o framework dispara o evento Load. Dentro de um manipulador de evento Load, você é livre para configurar a aparência e funcionalidade do Form, preparar quaisquer controles filhos contidos (como ListBox, Treeviews e qualquer outro), ou simplesmente alocar recursos utilizados durante a operação Form, (conexões de banco, proxys para objetos remotos como Client-Server).

Uma vez disparado o evento Load, o próximo evento a ser disparado é o Activated (Ativado), esse evento será ativado quando o formulário receber o foco com a janela ativa na área de trabalho. A parte contraria digamos assim desse evento é o Deactivate (Desativado) que disparara varias vezes pelo tempo de vida de um Form qualquer, assim que o usuário navegar entre os aplicativos ativos. Suponha que o usuário escolheu fechar o formulário em questão, dois disparos em eventos focados em fechar: Closing e Closed. O evento Closing é disparado primeiro e é um lugar ideal para mostrar ao usuário final uma mensagem muito odiada (mas util): Voce tem certeza que deseja fechar este aplicativo. Esse passo adaptável é extremamente útil para assegurar que o usuário tenha uma chance de salvar quaisquer dados focados em aplicativo, antes de terminar o programa.

O evento Closing funciona como um delegado CancelEventHandler definido no namespace System.ComponetModel. Se você ajustar a propriedade CancelEventArgs.Cancel para true, você evitara que a janela seja destruída e a instruirá para retornar para a operação normal. Se você ajustar o CancelEventArgs.Cancel para false, o evento Closed disparará, o aplicativos Windows Form descarregara o AppDomain e p processo terminara. Para solidificar a sequencia de eventos que tomam lugar durante o tempo de vida do formulário, suponha que você tenha um novo projeto Windows Form chamando FormLifeTime e tenha renomeado o formulário inicial para MainWindow.cs (Através do Solution Explorer) agora dentro do seu construtor de formulário manipule o evento Load,

Activated
Deactivate
Closing
Closed

Observação: Para gerar automático o evento do delegado correto basta pressionar TAB duas vezes depois digitar +=

public MainWindow()
 {
 InitializeComponent();
// Delegados apontados para os Eventos do Formulario
 Closing += new CancelEventHandler(MainWindow_FormClosing);
 Load += new EventHandler(MainWindow_Load);
 Closed += new EventHandler(MainWindow_FormClosed);
 Activated += new EventHandler(MainWindow_Activated);
 Deactivate += new EventHandler(MainWindow_Deactivate);
 }

Dentro dos manipuladores de eventos Load, Closed, Activated, Deactivated, você estará atualizando o valor de uma nova variável membro string de nível de Form, que acaba de ser interceptada. Assim note que dentro do manipulador de evento Closed, você mostrara o valor dessa string dentro de uma caixa de mensagem:

// Evento ao carregar formulario
private void MainWindow_Load(object sender, EventArgs e)
{
lifeTimeInfo += &amp;quot;&amp;gt;&amp;gt;&amp;gt; Carregando \n&amp;quot;;
}

// Evento quando o formulario é ativo
private void MainWindow_Activated(object sender, EventArgs e)
{
lifeTimeInfo += &amp;quot;&amp;gt;&amp;gt;&amp;gt; Ativado \n&amp;quot;;
}

// Evento quando o formulario é desativado
private void MainWindow_Deactivate(object sender, EventArgs e)
{
lifeTimeInfo += &amp;quot;&amp;gt;&amp;gt;&amp;gt; Desativado \n&amp;quot;;
}

// Evento quando o formulario é fechado
private void MainWindow_FormClosed(object sender, EventArgs e)
{
lifeTimeInfo += &amp;quot;&amp;gt;&amp;gt;&amp;gt; Fechado \n&amp;quot;;
MessageBox.Show(lifeTimeInfo);
}

Dentro do manipulador de evento Closing, você induzira o usuário para assegurar que ele ou ela terminem o aplicativo utilizando o CancelEventArgs de chagada. No código seguinte, note que o método MessageBox.Show() retornará um tipo DialogResult, que contem um valor que representa qual o botão oi selecionado pelo usuário final. Dessa forma, produziremos  uma caixa de mensagem que mostrara Yes (Sim) e No (Não)  então, estamos interessados em descobri r se o valor de retorno de Show() será DialogResult.No.

// Evento quando o formulario esta sendo fechado ele é chamando antes do evento Closed
private void MainWindow_FormClosing(object sender, CancelEventArgs e)
{
lifeTimeInfo += &amp;quot;Fechando \n&amp;quot;;
DialogResult dr = MessageBox.Show(this, &amp;quot;Você deseja realmente fechar esta janela&amp;quot;, &amp;quot;Evento Fechando (Closing) deste Form&amp;quot;, MessageBoxButtons.YesNo, MessageBoxIcon.Information);

// Qual dos Botoes foi clicado ?
if (dr == DialogResult.No)
e.Cancel = true;
else
e.Cancel = false;
}

Agora rode o aplicativo e mova o formulário para fora de foco algumas vezes (não dispare os eventos Activated e Deactivated). Uma vez desligado o aplicativo você vera uma caixa de mensagem que se parece como a figura a baixo:

Espero que tenham entendido os eventos em tempo de vida de um Form ou seja quando ele esta ativo na area de trabalho do usuario, varias coisas podem acontecer ao ativar, inativar, fechar um form, minimizar etc.

Abraços.
Até o próximo post.

Documentando seu Código Fonte em C# (Csharp) no Visual Studio 2008

Este post terá a finalidade de mostrar como documentar funções, métodos, atributos de uma classe em nosso dia-a-dia de desenvolvimento de software, utilizando os recursos do Visual Studio 2008. Quando desejar documentar seus tipos C# no Visual Studio 2008, seu primeiro passo é utilizar a nova notação de comentário de código com três barras “///”. Uma vez que um comentário da documentação tenha sido declarado, você tem liberdade para utilizar quaisquer elementos XML bem formados, inclusive o conjunto recomendado mostrado a baixo:

Elementos Pre-Definidos de Documento XML  e suas descrições

<c> – Indica que o texto a seguir deve ser uma “fonte de código” especificada.
<code> -Indica que varias linhas devem ser marcadas como código.
<exemple> – Cria um exemplo de código para o item que esta sendo descrito.
<exception> – Documenta quais exceções uma determinada classe pode gerar.
<list> – Insere uma lista ou tabela ao arquivo de documentação.
<param> – Descreve um determinando parâmetro.
<paramref> – Associa uma terminada Tag XML com um parâmetro especificado.
<permission> – Documenta os limites de segurança para um determinado membro.
<remarks> – Constrói uma descrição para um determinado membro.
<returns> – Documenta o valor de retorno do membro.
<see> – Faz referencia cruzada aos itens do documento.
<seealso> – Constrói uma seção “See Also” ou “Veja Também” em uma descrição.
<summary> – Documenta o “Resumo Executivo” para um determinado membro.
<values> – Documenta uma determinada propriedade.

Exemplo sem passagem de parâmetro e sem retorno

/// &amp;lt;summary&amp;gt;
/// Abre a Conexao com o banco de dados ou exibe o erro caso a base esteja
/// inconsistente
/// &amp;lt;/summary&amp;gt;
private static void abreConexao()
{
    try
    {
       conn.Open(); //Abre a conexão com BD
    }
    catch (Exception e)
    {
       throw new Exception(&amp;quot;Erro ao abrir a conexão: &amp;quot; + e.Message);
    }
}

Exemplo com passagem de parâmetros e com retorno do membro

/// &amp;lt;summary&amp;gt;
/// Executa uma query SELECT considerando os parâmetros (SqlParameter)
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&amp;quot;query&amp;quot;&amp;gt;Query a ser executado no banco de dados&amp;lt;/param&amp;gt;
/// &amp;lt;param name=&amp;quot;parameters&amp;quot;&amp;gt;Parâmetros da query (Ex. &amp;quot;@cod, @num, @nome&amp;quot;) etc.&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;Retorna o DataSet da query executada&amp;lt;/returns&amp;gt;
public static DataSet seleciona(string query, params SqlParameter[] parameters)
{
    try
    {
        DataSet ds = new DataSet();
        abreConexao();

        SqlCommand cmd = new SqlCommand(query, conn);
        foreach (SqlParameter param in parameters)
        cmd.Parameters.Add(param);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds); //Preenche DataSet
        cmd.Parameters.Clear();
        return ds;  //Retorna o DataSet já contendo os dados
    }
    catch (Exception e)
    {
        throw new Exception(&amp;quot;Erro ao selecionar query &amp;quot; + query + &amp;quot;\n&amp;quot; + e.Message);
    }
    finally
    {
        fechaConexao();
    }
}

Bom esse post foi bem simples, com a finalidade de mostrar os recursos disponíveis pelo Visual Studio 2008 para documentação de código, para quem é desenvolvedor, vale uma dica, se atente em documentar pela tabela acima mostrada neste post, fica mais organizado e profissional.

Abraços até a próxima.

Entendendo e utilizando construtores de classes em C# (CSharp)

1º O papel do construtor padrão

Cada classe em C# é fornecida com um construtor padrão gratuito, que pode ser redefinido se for necessário. Por definição, um construtor padrão nunca aceita argumentos. Além de alocar o novo objeto na memoria, o construtor padrão garante que todos os dados de campos configurados, para um calor padrão adequado. Se não estiver satisfeito com estas atribuições padrão, pode redefinir o construtor padrão de acordo com suas necessidades. Para ilustrar veja a classe abaixo:

class Carro
{
    public string Nome;
    public int VelocidadeCorrente;

    public Carro()
    {
        Nome = &amp;amp;quot;GOLF GTI 1.8&amp;amp;quot;;
        VelocidadeCorrente = &amp;amp;quot;60&amp;amp;quot;;
    }
}

Neste caso estamos forçando todos os objetos Carro a começar sua vida com o nome “GOLF GTI 1.8”, com a velocidade corrente de 60 km. Assim consegue criar um objeto Carro configurado para os seguintes valores padrão:

static void Main(string[] args)
{
    // Chamando o construtor padrao
    Carro CarroA = new Carro();

    // Imprimi a velocidade corrente de 60 km/h
    Console.Write(CarroA.VelocidadeCorrente);
}

2º Definindo construtores padrão

Tipicamente as classes definem construtores adicionais além do padrão. Ao fazer isso, você oferece ao usuário do objeto uma maneira simples e consistente para inicializar o estado de um objeto diretamente no momento da criação. Considere a seguinte atualização da classe “Carro” que agora ira suportar um total de três construtores de classe:

class Carro
{
    public string Nome;
    public int VelocidadeCorrente;

    // Construtor padrao personalizado
    public Carro()
    {
        Nome = &amp;amp;quot;GOLF GTI 1.8&amp;amp;quot;;
        VelocidadeCorrente = &amp;amp;quot;60&amp;amp;quot;;
    }

    // Aqui a VelocidadeCorrente recebera por padrao (zero)
    public Carro(string vNome)
    {
        Nome = vNome;
    }

    // Deixar que o chamandor configure o 'estado' completo do objeto Carro
    public Carro(string vNome, string vVelocidadeCorrente)
    {
        Nome = vNome;
        VelocidadeCorrente = vVelocidadeCorrente;
    }
}

Tenha em mente que o que diferencia um construtor do outro (aos olhos do compilador C#) é o numero e o tipo de argumentos do construtor. Portanto, o tipo “Carro” sobrecarregou o construtor para fornecer diversas maneiras de criar o objeto no momento da declaração. Seja qual for o caso, agora pode criar objetos “Carro” utilizando qualquer um dos construtores públicos. Por exemplo:

// Criar um carro Escort XR3
static void Main(string[] args)
{
    Carro CarroA = new Carro(&amp;amp;quot;ESCORT XR3&amp;amp;quot;);
}

// Criar um carro Escort XR3 com velocidade corrente de 90 km/h
static void Main(string[] args)
{
    Carro CarroA = new Carro(&amp;amp;quot;ESCORT XR3&amp;amp;quot;, &amp;amp;quot;90&amp;amp;quot;);
}

3º Recusando o construtor padrão

No entanto, assim que define um construtor personalizado, o construtor padrão é silenciosamente removido da classe e não esta mais disponível! Pense desta forma: se não definir um construtor personalizado, o compilador C# fornecera um padrão para permitir que o usuário do objeto aloque uma instancia de seu tipo com dados de campo para valores padrão corretos. Entretanto quando define um construtor exclusivo, o compilador supõe que lidou com as coisas a sua maneira.

Portanto, se deseja permitir que o usuário do objeto, crie uma instancia de seu tipo com o construtor padrão, bem como seu construtor personalizado, você deve, explicitamente, redefinir o construtor padrão. Para isso, compreenda que uma grande maioria dos casos, a implementação do construtor padrão de uma classe é intencionalmente vazia, já que tudo o que precisa é a capacidade é criar um objeto com valores padrão. Considere a seguinte atualização da classe “Carro”:

class Carro
{
    public int Intencidade;

    public void Aceleracao()
    {
        for (int i = 0; i &amp;amp;lt;= Intencidade; i++)
        {
            Console.Write(&amp;amp;quot;Yahoooooo Haaaaaewwwwww&amp;amp;quot;);
        }
    }

    // Recusar o construtor padrao
    public Carro()
    {

    }

    // Nosso construtor padrao agora!
    public Carro(int vIntencidade)
    {
        this.Intencidade = vIntencidade;
    }
}

Bom, finalizando esse foi mais um post sobre Construtores de Classe em C# (Csharp), espero que tenham gostado, pois lendo ele parece ser uma coisa ate simples, mas no dia-a-dia de um desenvolvedor de sistemas, nos deparamos como modificar um objeto a nosso favor em fim.

Ate à próxima!

Trabalhando com Listas (Coleções Genéricas)

Ola, Amigos.

Iniciaremos este tutorial falando sobre classe List<T> do namespace System.Collection.Generics ou também podemos falar objetos do tipo genérico.  O List<T> exige que especifique um único valor que descreva o tipo de item sobre o qual List<T> devera trabalhar ou armazenar. Portando se desejar criar três objetos List<T> para conter inteiros e os objetos SportCar() e Person(), terá que escrever o seguinte:

static void Main()
{
    List&amp;amp;lt;int&amp;amp;gt; MyInt = new List&amp;amp;lt;int&amp;amp;gt;();
    List&amp;amp;lt;SportCar&amp;amp;gt; MyCars = new List&amp;amp;lt;SportCar&amp;amp;gt;();           
    List&amp;amp;lt;Person&amp;amp;gt; MyPeople = new List&amp;amp;lt;Person&amp;amp;gt;();
}

Bom, no exemplo acima vemos como declarar um objeto do tipo List<T> e especificar o tipo que iremos objeto que este ira armazenar, podemos dizer que a classe List<T> é uma classe que pode armazenar vários tipos de objetos instanciados na memoria. Vejamos o exemplo abaixo:

private void addSportCarInList()
{
    SportCar MyCar = new SportCar();
   
    MyCar.returnModel = &amp;amp;quot;Mazda&amp;amp;quot;;
    MyCar.returnColor = &amp;amp;quot;White&amp;amp;quot;;
    MyCar.returnMaxSpeed = 210;

    List&amp;amp;lt;SportCar&amp;amp;gt; MyCars = List&amp;amp;lt;SportCar&amp;amp;gt;();
    MyCars.Add(MyCar);
}

No exemplo acima, nos criamos um objeto do tipo SportCar() e atribuímos as propriedades da classe que são: Modelo, Cor e Velocidade máxima, o valores que desejamos. Após isso criamos um objeto do tipo List<T> onde <T> nesta questão é do tipo SportCar ou seja <SportCar>.

No código acima nos podemos falar que o objeto List<SportCar> contem dentro de si uma instancia só do tipo SportCar, resumindo dentro de nossa Lista temos uma instancia de uma objeto Carro esportivo podemos comprovar isso pelo código abaixo:

MessageBox.Show(&amp;amp;quot;Total de carros em minha lista {0}&amp;amp;quot;, MyCars.Count);

No exemplo abaixo iremos adicionar vários carros em nossa lista de carros consequentemente no mundo POO (programação orientada a objeto) para cada carro iremos criar uma instancia. Vejamos no Exemplo:

private void addFiveSportCarInList()
{
    // Car 1
    SportCar MyCar1 = new SportCar();

    MyCar1.returnModel = &amp;amp;quot;Mazda&amp;amp;quot;;
    MyCar1.returnColor = &amp;amp;quot;White&amp;amp;quot;;
    MyCar1.returnMaxSpeed = 210;

    // Car 2
    SportCar MyCar2 = new SportCar();

    MyCar2.returnModel = &amp;amp;quot;Subaru&amp;amp;quot;;
    MyCar2.returnColor = &amp;amp;quot;Red&amp;amp;quot;;
    MyCar2.returnMaxSpeed = 180;

    // Car 3
    SportCar MyCar3 = new SportCar();

    MyCar3.returnModel = &amp;amp;quot;Volvo&amp;amp;quot;;
    MyCar3.returnColor = &amp;amp;quot;Green&amp;amp;quot;;
    MyCar3.returnMaxSpeed = 200;
   
    // Car 4
    SportCar MyCar4 = new SportCar();

    MyCar4.returnModel = &amp;amp;quot;Volkswagen&amp;amp;quot;;
    MyCar4.returnColor = &amp;amp;quot;Black&amp;amp;quot;;
    MyCar4.returnMaxSpeed = 240;
   
    // Car 5
    SportCar MyCar5 = new SportCar();

    MyCar5.returnModel = &amp;amp;quot;Ferrari&amp;amp;quot;;
    MyCar5.returnColor = &amp;amp;quot;Silver&amp;amp;quot;;
    MyCar5.returnMaxSpeed = 210;

    List&amp;amp;lt;SportCar&amp;amp;gt; MyCars = List&amp;amp;lt;SportCar&amp;amp;gt;();
    MyCars.Add(MyCar);

    MessageBox.Show(&amp;amp;quot;Total de carros em minha lista {0}&amp;amp;quot;, MyCars.Count);
}

Também podemos acessar métodos e propriedades do objeto SportCar() armazenado dentro de nossa lista, podemos fazer isso percorrendo nossa List<SportCar>, através de uma laço de repetição for, while, do while etc. visto que é uma lista ou também coleção de objetos. Vejamos o exemplo abaixo:

int i = 0;
for (i = 0; i &amp;amp;lt;= MyCars.Count - 1; i++)
{
    MessageBox.Show(&amp;amp;quot;Carro número {0} sua marca é: {1}&amp;amp;quot;, i.ToString(), MyCars[i].returnModel.ToString());
}

 
No código acima fazemos um laço de repetição “for” para contar nossa lista de carros e exibir o modelo de cada um deles, no caso acima igualamos nossa variável “i” igual a zero só que para uma lista a qual estamos trabalhando ou um Array (vetor) a quantidade de objetos dentro sempre se inicia em um e não em zero, é por esse motivo que colocamos no meio de laço “for”

i &amp;amp;lt;= MyCars.Count - 1

O total de itens da nossa lista menos um, isso por que nosso contador “i” é iniciado em zero.  Vale apena lembrar que a ordem em que instanciamos os objetos do mesmo tipo é a mesma ordem que esta armazenado dentro do objeto List<SportCar>.

Podemos dizer então que no caso acima em que adicionamos cinco carros em nossa lista o primeiro que instanciamos a marca dele é Mazda, pois é esse é o primeiro da nossa lista, como no exemplo do laço podemos perceber que o nome do primeiro carro que aparece no laço é o da marca Mazda, e assim por diante, como na ordem de instanciação.

Podemos também remover objetos desta lista usando o método Remove de nossa lista criada.
Vejamos no exemplo:

int i = 0;
for (i = 0; i &amp;amp;lt;= MyCars.Count - 1; i++)
{
    if (MyCars[i].returnModel == &amp;amp;quot;Volvo&amp;amp;quot;)
    {
        SportCar MyCarRemove = MyCars[i];
        MyCars.Remove(MyCarRemove);

        MessageBox.Show(&amp;amp;quot;Carro removido da lista&amp;amp;quot;);
    }   
}

No código acima nos removemos de nossa lista de carros, o carro de marca “Volvo” podemos perceber que nos criamos um objeto, mas não instanciamos um novo usando a sintaxe new e assim criamos uma variável do tipo SportCar e igualamos essa variável a um carro que estava dentro de nossa lista, esta ai o motivo por que não precisamos instanciar e sim só referenciamos a um que já estava lá dentro na nossa lista e depois passamos a variável ou objeto do tipo SportCar para a lista através do método remove, e esse método é o que ira remover o carro da marca Volvo da nossa lista.

Para limpar uma lista com vários objetos dentro podemos usar o método Clear, podemos limpar a lista como no exemplo abaixo:

MyCars.Clear();

O método acima limpa todas as instancias de objetos que a lista aceita que por ventura esteja carregada. Como vimos à coleção de genéricos do framework dot net permite dar soluções para eventuais problemas de desenvolvimento de softwares de nosso dia-a-dia. Além disso, os tipos genéricos geralmente excluem a necessidade de construir tipos de coleção personalizados.

Podemos utilizar List<T> em inumeráveis situações no desenvolvimento de software seja desktop ou web uma situação ótima para citar a inclusão de uma Lista seria implementar um carrinho de compras para um sistema de e-commerce.

Espero que tenham gostado deste post, pois em minhas horas de desenvolvimento de software sempre estou utilizando generics, collections entre estes a classe List<T>, sempre para guardar objetos fortemente tipados do projeto em que estou trabalhando.

Até o próximo post.