Você está aqui: Cards de AutoCAD Civil 3D |
||
|
||
|
|
||
Angular ::: Artigos e Tutorias ::: CRUD - CREATE, READ, UPDATE, DELETE |
Tutorial Angular para iniciantes: Como criar uma aplicação que grava novos alunos em uma base de dados MySQL usando PHP como back-end - Versão Angular CLIQuantidade de visualizações: 6898 vezes |
|
Neste pequeno tutorial mostrarei como é possível usar o framework Angular para desenvolver um front-end que permite cadastrar alunos no banco de dados MySQL usando a linguagem PHP como back-end. É claro que você poderá trocar o PHP por Node.js ou qualquer linguagem do lado do servidor. O importante aqui é entender o processo de desenvolvimento. Então, se você ainda não o fez, verifique se o Angular CLI está devidamente instalado e funcionando na sua máquina. Isso pode ser feito abrindo-se uma nova janela de terminal e disparando o comando: c:\estudos_web>ng --version Sua máquina deverá retornar algo parecido com: Angular CLI: 11.2.1 Node: 14.15.4 OS: win32 x64 Obteve resultado semelhante? Então podemos prosseguir. Comece disparando o comando abaixo para criar uma nova aplicação Angular usando o Angular CLI: c:\docs_osmar>cd c:\estudos_angular c:\estudos_angular>ng new escola Veja que pedi para o comando ng do Angular CLI criar um novo projeto com o nome escola (você pode escolher o nome que desejar). Aguarde alguns minutos até que o processo seja finalizado. Criando a entidade Aluno, ou a classe Aluno, ou melhor ainda, o model Aluno Como nossa aplicação vai gravar alunos na base de dados, nada melhor do que começar criando nossa entidade ou model Aluno. Vá até a pasta "C:\estudos_angular\escola\src\app" e crie um arquivo chamado aluno.ts com o seguinte conteúdo:
export class Aluno{
id: number = 0;
matricula: number;
nome: string;
curso: string;
constructor(matricula: number, nome: string,
curso: string, id?: number) {
this.matricula = matricula;
this.nome = nome;
this.curso = curso;
}
}
Veja que nosso model Aluno possui os atributos matricula, nome, curso e id (que é opcional na classe, pois será gerado automaticamente pela tabela no banco de dados MySQL. O passo seguinte é criar o serviço que nos permitirá a comunicação com o servidor remoto, a saber: a página PHP que gravará os dados na base MySQL. Criando o serviço aluno.service para a comunicação com o servidor remoto Para criar o serviço que nos permitirá gravar os alunos na base de dados MySQL, abra uma janela de terminal (ou use a que você já tem aberta) e dispare o seguinte comando: c:\escola>ng generate service cadastros/aluno --flat CREATE src/app/cadastros/aluno.service.spec.ts (352 bytes) CREATE src/app/cadastros/aluno.service.ts (134 bytes) Note que este comando deve ser disparado dentro da pasta da sua aplicação. Agora, temos um arquivo aluno.service.ts dentro da pasta cadastros no diretório C:\estudos_angular\escola\src\app (o seu deve ser diferente, não se esqueça). Assim, abra o arquivo aluno.service.ts e vamos modificá-lo para o seguinte código:
import {Injectable} from '@angular/core';
// precisamos do serviço HTTP para fazer a requisição AJAX
import {HttpClient, HttpErrorResponse, HttpParams} from '@angular/common/http';
// precisamos também do Observable, do map e catchError
import {Observable, throwError} from 'rxjs';
import {map, catchError} from 'rxjs/operators';
// precisamos também da classe Aluno
import {Aluno} from '../aluno';
@Injectable({
providedIn: 'root'
})
export class AlunoService {
// url base do endereço do serviço remoto
baseUrl = 'http://localhost/servicos';
// vetor de alunos já gravados
alunos: Aluno[] = [];
// vamos fazer uma injeção de dependência aqui
constructor(private http: HttpClient){}
// método que permite fazer uma requisição HTTP e gravar
// o novo aluno
cadastrar(aluno: Aluno): Observable<Aluno[]> {
const dados = {
nome: aluno.nome, matricula: aluno.matricula,
curso: aluno.curso,
};
return this.http.post(`${this.baseUrl}/gravar_aluno.php`, {dados: aluno})
.pipe(map((res) => {
// adiciona o novo aluno no vetor de alunos
this.alunos.push(res['dados']);
// e o retorna para o chamador deste método
return this.alunos;
}),
catchError(this.tratarErro));
}
private tratarErro(error: HttpErrorResponse) {
// vamos mostrar o erro no console
console.log(error);
// e vamos matar a aplicação aqui, pois não há mais nada
// a fazer
return throwError('Houve um erro: ' + error);
}
}
Há algumas importações importantes neste serviço: Injectable do '@angular/core', HttpClient, HttpErrorResponse e HttpParams do '@angular/common/http', Observable e throwError do 'rxjs', map e catchError do 'rxjs/operators' e, mais importante, a classe Aluno de '../aluno'. Em outras dicas em nosso site você aprenderá melhor sobre cada um desses imports. No construtor da classe AlunoService nós fazemos uma injeção de dependência (DI) para um objeto HttpClient, que será usado para fazer uma requisição POST. Esta requisição ocorre no método cadastrar(), que recebe um objeto da classe Aluno e o fornece como JSON na requisição POST. Assim que o novo aluno é cadastrado na base de dados MySQL, este método retorna o novo aluno (como JSON) e nós o adicionamos a um vetor de alunos, que será exibido na tela de cadastro para indicar os alunos já cadastrados. Antes de prosseguirmos, que diacho é esse erro "implicitly has an 'any' type"? Se você tentar executar a aplicação agora, de imediato já notará duas mensagens de erro (ou pelo menos uma delas): Error: src/app/app.component.ts:24:18 - error TS7006: Parameter 'f' implicitly has an 'any' type. 24 cadastrarAluno(f) { Error: src/app/cadastros/aluno.service.ts:36:26 - error TS7053: Element implicitly has an 'any' type because expression of type '"dados"' can't be used to index type 'Object'. Property 'dados' does not exist on type 'Object'. 36 this.alunos.push(res['dados']); Se elas aparecem na sua versão do Angular, basta adicionar a linha "noImplicitAny": false no arquivo tsconfig.json na raiz da aplicação e o problema será resolvido. Já estamos bem adiantados. Hora de escrever o código do app.component.ts O Angular CLI já criou um arquivo app.component.ts. Abra-o e altere o seu código para a versão abaixo:
import {Component} from '@angular/core';
// importamos a classe Aluno
import {Aluno} from './aluno';
// importamos o serviço AlunoService
import {AlunoService} from './cadastros/aluno.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
alunos: Aluno[] = [];
// criamos uma nova instância da classe Aluno
aluno = new Aluno(0, '', '', 0);
erro = '';
sucesso = '';
// fazemos uma injeção de dependência aqui
constructor(private alunoService: AlunoService) {}
// aqui temos o método que permitirá cadastrar um novo aluno
cadastrarAluno(f) {
this.alunoService.cadastrar(this.aluno)
.subscribe(
(res: Aluno[]) => {
// recebemos a lista atualizada de alunos
this.alunos = res;
// enviamos um ok para o formulário
this.sucesso = 'Aluno cadastrado com sucesso.';
// finalmente resetamos o formulário
f.reset();
},
(err) => this.erro = err
);
}
}
Neste arquivo temos uns imports importantes: Component do '@angular/core', Aluno de './aluno' e AlunoService de './cadastros/aluno.service'. Em seguida, dentro da anotação @Component nós temos as definições para o selector, o templateUrl e o styleUrls. Finalmente, na classe AppComponent, nós temos as declaramos de um vetor de Aluno[], um objeto da classe Aluno e algumas variáveis auxiliares. No construtor dessa classe nós fazemos uma injeção de dependência (DI) para um objeto da classe AlunoService. Então temos o método cadastrarAluno(), que recebe o formulário HTML e o repassa para o método cadastrar() do aluno.service. Como retorno desse método nós obtemos a lista atualizada dos alunos já cadastrados nessa sessão (atenção: não estamos obtendo os alunos cadastrados anteriomente na base de dados MySQL. Isso será visto em outra parte do tutorial). Já temos o app.component.ts, vamos complementar o app.component.html Com o app.component.ts devidamente ajustado, vamos nos concentrar agora no app.component.html, que contém o formulário que nos permitirá cadastrar os alunos. Veja o código completo para ele:
<h3>Cadastrar Novo Aluno</h3>
<form #f="ngForm" name="cadastrarForm">
<table width="200" border="0" cellspacing="3" cellpadding="3">
<tr>
<td>Matrícula:</td>
<td><input type="text" name="matricula" [(ngModel)]="aluno.matricula"></td>
</tr>
<tr>
<td>Nome:</td>
<td><input type="text" name="nome" [(ngModel)]="aluno.nome"></td>
</tr>
<tr>
<td>Curso:</td>
<td><input type="text" name="curso" [(ngModel)]="aluno.curso"></td>
</tr>
<tr>
<td> </td>
<td><button (click)="cadastrarAluno(f)">Gravar</button></td>
</tr>
</table>
</form>
<div *ngIf="erro" class="alert alert-danger">{{erro}}</div>
<div *ngIf="sucesso" class="alert alert-success">{{sucesso}}</div>
<ul *ngFor="let aluno of alunos; let i = index;">
<li>{{i + 1}}; {{aluno.matricula}}; {{aluno.nome}}; {{aluno.curso}}</li>
</ul>
Veja que fiz um código HTML bem simples, sem firulas. Depois que você entender todos os elementos, então você poderá formatar e deixar mais bonito. O importante é observar como usamos ngModel para ligar os campos do formulário aos atributos da classe Aluno. Coloquei também dois ngIf para mostrar as mensagens de sucesso e de erro, e, finalmente, um ngFor para percorrer e exibir os alunos já cadastrados durante essa sessão. Vamos lá? Já podemos executar o exemplo. A partir da pasta raiz da aplicação, dispare o comando abaixo: c:\estudos_angular\escola>ng serve --open Depois de alguns segundos teremos o seguinte resultado: ![]() Obteve o mesmo resultado? Que maravilha! Mas não podemos cadastrar alunos ainda, pois a parte do back-end ainda não foi desenvolvida. Mas isso é coisa simples. Criando a tabela no banco de dados MySQL Nosso front-end já está completo e rodando. Chegou a hora de nos concentrarmos no back-end. Inicialmente vamos criar a tabela na base de dados MySQL. Veja sua estrutura e o código SQL DDL para a sua criação: CREATE TABLE `alunos` ( `id` int(11) NOT NULL, `matricula` int(11) NOT NULL, `nome` varchar(100) NOT NULL, `curso` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; Marque o campo id como chave primária e auto-incremento. Agora vamos ao código PHP, que mantive muito simples também, sem validações, o que deixo por sua conta. A página PHP que recebe os alunos e os gravam na tabela MySQL Segue abaixo o código completo para a página gravar_aluno.php, colocada no diretório "C:\xampp\htdocs\servicos" (fique atento ao endereço onde você vai colocá-la, seja na sua máquina local ou em um servidor remoto):
<?php
// não deixe quebra de linha nos headers abaixo
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET,
PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin,
X-Requested-With, Content-Type, Accept');
header("Content-Type: application/json; charset=utf-8");
// vamos obter os dados vindo do formulário
// atenção: em um código real temos que validar
$dados = file_get_contents("php://input");
// a requisição foi post?
if(isset($dados) && !empty($dados)){
$request = json_decode($dados);
$nome = $request->dados->nome;
$matricula = $request->dados->matricula;
$curso = $request->dados->curso;
// vamos efetuar a conexão com o banco
$con = new mysqli("localhost", "root",
"osmar1234", "estudos");
// conexão efetuada com sucesso?
if($con->connect_errno){
echo "Não foi possível efetuar a conexão: " .
$mysqli->connect_error;
exit(); // vamos sair daqui
}
// comando sql
$query = "INSERT INTO alunos(id, matricula, nome,
curso) VALUES (null, '$matricula', '$nome', '$curso')";
// vamos disparar o comando sql
if(mysqli_query($con, $query)){
http_response_code(201);
$aluno = [
'matricula' => $matricula,
'nome' => $nome,
'curso' => $curso,
'id' => mysqli_insert_id($con)
];
// vamos retornar o aluno recém cadastrado
echo json_encode(['dados'=>$aluno]);
}
else{
http_response_code(422);
}
}
?>
Se você observar atentamente o nosso exemplo, verá que a aplicação Angular está rodando em http://localhost:4200 enquanto a página PHP estará rodando em http://localhost/servicos/gravar_aluno.php, ou seja, mesmo servidor mas portas diferentes. Dessa forma, a requisição AJAX feita a partir da aplicação Angular vai falhar, com a seguinte mensagem de erro: Access to XMLHttpRequest at 'http://localhost/servicos/gravar_aluno.php' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Por essa razão, a página PHP contém os headers que liberam o acesso cross-site (de servidor diferente): // não deixe quebra de linha nos headers abaixo header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept'); header("Content-Type: application/json; charset=utf-8"); Um outro detalhe interessante é o uso da função PHP file_get_contents("php://input") para receber o JSON enviado pela aplicação Angular. Programadores PHP vão achar isso uma "gambiarra", mas, atualmente, essa é a única forma de recebermos uma requisição POST usando JSON no PHP. O restante do código é fácil de entender: criamos a conexão com o banco de dados, gravamos o aluno e retornamos um novo JSON contendo o novo aluno inserido. Note o uso de mysqli_insert_id() para obter o id do registro recém-inserido com o propósito de devolvermos o novo aluno com esse atributo já preenchido. E agora o resultado final. Veja a imagem abaixo: ![]() Conseguiu executar o exemplo também? Em outra dicas de Angular você encontra as demais partes do tutorial, a saber: listar, editar e excluir os alunos. Até lá e bons estudos. |
C++ ::: Dicas & Truques ::: Programação Orientada a Objetos |
Programação Orientada a Objetos em C++ - Como usar construtores em suas classes C++Quantidade de visualizações: 16091 vezes |
|
Quando um objeto de uma classe C++ é criado, a linguagem chama um construtor para tal classe. Se nenhum construtor estiver definido, um construtor padrão é invocado. Este construtor aloca memória para o objeto, mas não o inicializa. Um construtor é um método que definimos em nossas classes C++ e que possui o mesmo nome da classe. Um construtor não possui tipo de retorno e não retorna nenhum valor. Em geral construtores são públicos, mas, é possível termos construtores privados. Neste caso, somente um método estático da classe poderia criar novos objetos da classe (quando puder dê uma olhada no padrão de projeto Singleton). O uso mais frequente dos métodos construtores é quando queremos inicializar valores das variáveis e demais recursos no momento da criação de uma nova instância da classe. Esta é uma técnica útil, visto que não precisamos dispor de esforço extra para inicializar as variáveis de instância de um objeto, individualmente, após sua criação. Vamos ver um exemplo da definição e uso de construtores em uma classe C++? Comece analisando o código para o arquivo de definição da classe Pessoa: Código para Pessoa.h:
// vamos evitar múltiplas inclusões do
// arquivo de cabeçalho (header file)
#ifndef PESSOA_H
#define PESSOA_H
// vamos incluir o header string
#include <string>
using namespace std;
class Pessoa{
public:
// construtor da classe Pessoa
Pessoa(string, string, int);
// método que permite retornar o nome da pessoa
string getNome();
// método que permite retornar o e-mail da pessoa
string getEmail();
// método que permite retornar a idade da pessoa
int getIdade();
private:
// variáveis privadas
string nome;
string email;
int idade;
};
#endif
Veja a assinatura do método construtor: Pessoa(string, string, int); Note que na lista de parâmetros do construtor não precisamos informar os nomes dos parâmetros, apenas seus tipos. Veja agora o arquivo de implementação para esta classe: Código para Pessoa.cpp:
// arquivo de implementação para a
// classe Pessoa
// vamos incluir o header Pessoa.h
#include "Pessoa.h"
// implementação do construtor
Pessoa::Pessoa(string nome, string email, int idade){
this->nome = nome;
this->email = email;
this->idade = idade;
}
// método que permite obter o nome da pessoa
string Pessoa::getNome(){
return this->nome;
}
// método que permite obter o email da pessoa
string Pessoa::getEmail(){
return this->email;
}
// método que permite obter a idade da pessoa
int Pessoa::getIdade(){
return this->idade;
}
Note que na implementação do método construtor nós recebemos os argumentos para os parâmetros e os usamos para inicializar as variáveis privadas da instância da classe. Observe o uso do ponteiro this para nos referirmos à instância atual da classe Pessoa. Finalmente, veja o código para o método main() do programa. É aqui que criamos um novo objeto da classe Pessoa e usamos seu método construtor para inicializar suas variáveis privadas de uma só vez: Código para main.cpp:
#include <cstdlib>
#include <iostream>
// vamos incluir a classe Pessoa
#include "Pessoa.h"
using namespace std;
int main(int argc, char *argv[])
{
// vamos criar um novo objeto da classe Pessoa
Pessoa *p = new Pessoa("Osmar J. Silva",
"osmar@arquivodecodigos.net", 38);
// vamos exibir os dados da pessoa
cout << "Nome: " << p->getNome() << endl;
cout << "E-Mail: " << p->getEmail() << endl;
cout << "Idade: " << p->getIdade() << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Além do construtor, uma classe C++ possui também um método destrutor. Veja minhas dicas relacionadas a este assunto para aprender como definir e usar destrutores em suas classes C++. |
Java ::: Java + MySQL ::: Passos Iniciais |
Java MySQL - Como efetuar uma conexão Java + JDBC + MySQL usando o NetBeans IDEQuantidade de visualizações: 8595 vezes |
|
Se sua intenção é usar a linguagem Java em combinação com o banco de dados MySQL, o primeiro passo é aprender como se conectar a este banco de dados usando JDBC (Java Database Connectivity). Para isso, siga atentamente os passos abaixo: a) Pesquise e baixe o driver Sun Microsystem's JDBC Driver for MySQL. A versão mais recente deste driver é chamada de MySQL Connector/J e pode ser baixada no endereço http://dev.mysql.com/downloads. Durante a autoria deste artigo, o nome do arquivo a ser baixado era semelhante à mysql-connector-java-5.1.10.zip. b) Depois de descompactar o arquivo baixado, adicione uma referência para o Jar mysql-connector-java-5.1.10-bin.jar. Se você estiver usando NetBeans, crie uma nova aplicação. Em seguida clique com o botão direito em Bibliotecas -> Adicionar Jar/pasta e localize o jar. Em seguida clique o botão Open. c) Hora de efetuar uma conexão com o banco de dados. Para este exemplo eu fiz uma conexão com o MySQL 5.0 (o nome da base de dados que usei foi "estudos"). Veja o código:
package estudosjavamysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class EstudosJavaMySQL{
public static void main(String[] args){
// strings de conexão
String databaseURL = "jdbc:mysql://localhost/estudos";
String usuario = "root";
String senha = "osmar1234";
String driverName = "com.mysql.jdbc.Driver";
try {
Class.forName(driverName).newInstance();
Connection conn = DriverManager.getConnection(databaseURL, usuario, senha);
System.out.println("Conexão obtida com sucesso.");
}
catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
catch (Exception e) {
System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
}
}
}
Execute a aplicação. Se tudo correu bem você verá o resultado: Conexão obtida com sucesso. |
PHP ::: Dicas & Truques ::: Strings e Caracteres |
Como converter uma string para letras maiúsculas em PHP usando as funções strtoupper() e mb_strtoupper()Quantidade de visualizações: 1 vezes |
As funções strtoupper() e mb_strtoupper() do PHP nos ajuda quando precisamos transformar uma string inteira para letras maiúsculas. Veja o seguinte exemplo:<?php // uma frase contendo letras minúsculas $frase = "PHP? Eu gosto de PHP"; echo "A frase é: " . $frase . "\n"; // agora vamos transformá-la em letras // maiúsculas $frase = strtoupper($frase); echo "A frase em letras maiúsculas é: " . $frase; ?> Ao executar este código PHP nós teremos o seguinte resultado: A frase é: PHP? Eu gosto de PHP A frase em letras maiúsculas é: PHP? EU GOSTO DE PHP A função mb_strtoupper(), por sua vez, é usada quando a palavra, frase ou texto contém acentuações. Nas versões mais recentes do PHP, a função strtoupper() sozinha não consegue converter caracteres minúsculas com acentos para caracteres maiúsculas acentuados. Por isso, a função mb_strtoupper() é usada. Veja: <?php // uma frase contendo letras minúsculas $frase = "Java? Não gosto muito de Java não"; echo "A frase é: " . $frase . "\n"; // agora vamos transformá-la em letras // maiúsculas $frase1 = strtoupper($frase); echo "Usando strtoupper(): " . $frase1; $frase2 = mb_strtoupper($frase, 'UTF-8'); echo "\nUsando mb_strtoupper(): " . $frase2; ?> Ao executar este código PHP nós teremos o seguinte resultado: A frase é: Java? Não gosto muito de Java não Usando strtoupper(): JAVA? NãO GOSTO MUITO DE JAVA NãO Usando mb_strtoupper(): JAVA? NÃO GOSTO MUITO DE JAVA NÃO Veja que usei o valor "UTF-8" como segundo argumento para a função mb_strtoupper(). Se necessário você pode fornecer o valor "ISO-8859-1" também. |
C# ::: Coleções (Collections) ::: List<T> |
Como usar a classe genérica List<T> do C# em suas aplicaçõesQuantidade de visualizações: 15878 vezes |
A classe genérica List<T> da linguagem C# representa uma lista fortemente tipada de objetos que podem ser acessados por índices. Esta classe fornece métodos para pesquisar, ordenar e manipular seus elementos. Veja sua posição na hierarquia de classes da plataforma .NET:
System.Object
System.Collections.Generic.List<T>
System.ServiceModel.Install.Configuration.
ServiceModelConfigurationSectionCollection
System.ServiceModel.Install.Configuration.
ServiceModelConfigurationSectionGroupCollection
System.Workflow.ComponentModel.ActivityCollection
System.Workflow.Activities.WorkflowRoleCollection
System.Workflow.Activities.OperationParameterInfoCollection
System.Workflow.ComponentModel.Design.
ActivityDesignerGlyphCollection
System.Workflow.Runtime.Tracking.ExtractCollection
System.Workflow.Runtime.Tracking.TrackingAnnotationCollection
System.Workflow.Runtime.Tracking.TrackingConditionCollection
System.Workflow.Runtime.Tracking.ActivityTrackingLocationCollection
System.Workflow.Runtime.Tracking.UserTrackingLocationCollection
System.Workflow.Runtime.Tracking.ActivityTrackPointCollection
System.Workflow.Runtime.Tracking.UserTrackPointCollection
System.Workflow.Runtime.Tracking.WorkflowTrackPointCollection
Esta classe implementa também as interfaces IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection e IEnumerable. A classe List<T> é a equivalente genérica da classe ArrayList. Ela implementa a interface genérica IList<T> usando um array (matriz) cujo tamanho é dinamicamente aumentado de acordo com a necessidade. Esta classe usa tanto um comparador de igualdade quanto um de ordenação. Os métodos tais como Contains(), IndexOf(), LastIndexOf() e Remove() usam um comparador de igualdade para os elementos da lista. O comparador de igualdade padrão para o tipo T é definido segundo as seguintes regras: Se o tipo T implementar a interface genérica IEquatable<T>, então o comparador de igualdade é o método Equals(T) dessa interface. Caso contrário, o comparador de igualdade padrão é Object.Equals(Object). Os métodos tais como BinarySearch() e Sort() usam um comparador de ordenação para os elementos da lista. O comparador padrão para o tipo T é definido da seguinte forma: Se o tipo T implementar a interface genérica IComparable<T>, então o comparador padrão é o método CompareTo(T) dessa interface. Caso contrário, se o tipo T implementar a interface não-genérica IComparable, então o comparador padrão é o método CompareTo(Object) dessa interface. Se o tipo T não implementar nenhuma destas duas interfaces, então não haverá comparador padrão, e um comparador ou delegate de comparação deve ser fornecido explicitamente. Uma lista List<T> não fornece garantias quanto à sua ordenação. Devemos ordená-la por conta própria antes de efetuar algumas operações (tais como BinarySearch) que exigem que a List<T> esteja ordenada. Os elementos em uma coleção do tipo List<T> podem ser acessados usando índices (que começam a partir de 0). Uma List<T> aceita o valor null como valor válido para tipos referência e aceita elementos duplicados. Em relação à performance, a documentação do .NET afirma que, embora List<T> e ArrayList possuam funcionalidade semelhante, a classe List<T> possui uma performance melhor na maioria dos casos, além de ser type safe (oferece segurança de tipos). Veja um trecho de código no qual criamos uma List<T> de inteiros, inserimos alguns valores e usamos o laço foreach para percorrer a lista e exibir os valores dos elementos:
static void Main(string[] args){
// vamos criar um objeto da classe List<T>
List<int> valores = new List<int>();
// vamos inserir três valores na lista
valores.Add(5);
valores.Add(2);
valores.Add(9);
// vamos usar o laço foreach para percorrer os elementos
// na lista
foreach(int v in valores){
Console.WriteLine(v);
}
// vamos pausar a execução
Console.ReadKey();
}
|
Desafios, Exercícios e Algoritmos Resolvidos de C# |
Veja mais Dicas e truques de C# |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |







