Garbage collector - Coletor de lixo
O garbage collector, ou coletor de lixo, muitas vezes é ignorado pelos programadores e analistas, mas é um ponto importante a ser considerado.
O princípio básico de como um garbage collector funciona é:
- Determinar que objetos não mais serão utilizados no futuro.
- Liberar os recursos utilizados por esses objetos
Em linguagens mais antigas, esses recursos deveriam ser liberados manualmente, ficando a cargo do programador o controle de objetos não utilizados.
Com o garbage collector, encontrado em linguagens atuais como, por exemplo, JAVA, C# e a grande maioria das linguagens script, não temos mais que nos preocupar com a liberação de recursos enquanto desenvolvemos ( com exceção para celulares, ou aparelhos com hardware limitado , porém, será que a liberação manual não nos trás alguns benefícios?
A resposta é sim. Deixar o garbage collector trabalhar por nós significa perder processamento para verificar quais objetos não serão mais utilizados no futuro, o que não é uma tarefa tão simples se pensarmos em lógica.
Quando liberamos recursos no sistema manualmente, esse processo deixa de ser longo, logo, o processamento utilizado pelo garbage collector é menor e sua aplicação vai rodar mais rápido.
Em compensação, o programador tem um trabalho maior e a chance de bugs acontecerem também aumenta.
- Bugs causados por ponteiros
- Doubble free - Bug causado pela tentativa de liberar memória quando essa já está livre.
- Memory leaks - Quando a tentativa de liberar memória falha, causando sua exaustão.
Recursividade no SQL Server 2005
Aqueles que tem problemas em relacionar dados em um banco de dados onde há uma amarração por meio de árvore, segue uma boa dica de como utilizar querys recursivas no SQL Server.
Antes de mais nada vamos preparar a tabela que utilizaremos em nosso exemplo:
CREATE TABLE Hierarquia (Criada a tabela e inserida seu elementos vamos a nossa query de recursividade:
IdHierarquia INT PRIMARY KEY,
IdHierarquiaPai INT
)
INSERT INTO Hierarquia VALUES (1,NULL);
INSERT INTO Hierarquia VALUES (2,4);
INSERT INTO Hierarquia VALUES (3,1);
INSERT INTO Hierarquia VALUES (4,1);
INSERT INTO Hierarquia VALUES (5,2);
INSERT INTO Hierarquia VALUES (6,4);
INSERT INTO Hierarquia VALUES (7,3);
INSERT INTO Hierarquia VALUES (8,1);
INSERT INTO Hierarquia VALUES (9,2);
INSERT INTO Hierarquia VALUES (10,1);
INSERT INTO Hierarquia VALUES (11,4);
INSERT INTO Hierarquia VALUES (12,2);
INSERT INTO Hierarquia VALUES (13,3);
INSERT INTO Hierarquia VALUES (14,1);
INSERT INTO Hierarquia VALUES (15,4);
INSERT INTO Hierarquia VALUES (16,3);
INSERT INTO Hierarquia VALUES (17,2);
INSERT INTO Hierarquia VALUES (18,2);
INSERT INTO Hierarquia VALUES (19,1);
INSERT INTO Hierarquia VALUES (20,1);
WITH Filhos(IdHierarquia, IdHierarquiaPai, nivel, coluna)
AS
(
-- Membro Ancora
SELECT
IdHierarquia,
IdHierarquiaPai,
0,
CAST(IdHierarquia AS BINARY(900))
FROM Hierarquia
UNION ALL
-- Membros Recursivos
SELECT
H.IdHierarquia,
H.IdHierarquiaPai,
F.nivel + 1,
CAST(coluna + CAST(H.IdHierarquia AS BINARY(10)) AS BINARY(900))
FROM Hierarquia H
INNER JOIN Filhos F ON H.IdHierarquiaPai = F.IdHierarquia
)
-- Query com Resultado
SELECT
IdHierarquiaPai,
IdHierarquia,
REPLICATE('| ' , nivel)
+ (CAST(IdHierarquia AS VARCHAR(20))) AS [Arvore de Hierarquia]
FROM Filhos
ORDER BY coluna
Vamos entender oque foi feito.
1º A utlização do WITH vem de um dos novos recursos atribuídos ao SQL Server 2005, onde é utilizado para criação de views temporárias, válida somente dentro do seu batch atual. Esse recurso é denomindado de Common Table Expressions(CTE).
Sintaxe:
WITH [name] AS (
[instrução SELECT]
)
2º A utilização de UNION ALL separando as querys a serem utilizadas, sendo que a primeira é a própria view criada a partir do primeiro elemento de comparação, no nosso caso:
-- Membro Ancora
SELECT
IdHierarquia,
IdHierarquiaPai,
0,
CAST(IdHierarquia AS BINARY(900))
FROM Hierarquia
O primeiro SELECT é denominado de membro âncora, definindo o ponto de entrada da hirarquia.
O segundo SELECT é denominado de membros recursivos onde é incluído o CTE criado em JOIN com a tabela a ser buscado os elementos:
-- Membros Recursivos
SELECT
H.IdHierarquia,
H.IdHierarquiaPai,
F.nivel + 1,
CAST(coluna + CAST(H.IdHierarquia AS BINARY(10)) AS BINARY(900))
FROM Hierarquia H
INNER JOIN Filhos F ON H.IdHierarquiaPai = F.IdHierarquia
Acho que valeu a dica.
Bom Divertimento!
referências:
Ordenar DataTable usando um DataView
Segue um exemplo de ordenação de DataTable utilizando um DataView com C#.
// Imagine o Datatable abaixo já carregado com os dados
DataTable dados;
// Criaremos um DataView usando a DefaultView do
// DataTable (lembrando que o DataTable já deve estar
// carregado com os dados neste momento).DataView dvOrdenado = dados.DefaultView;
// Usamos o método Sort do DataView passando como
// argumento o nome das colunas na sequência que
// deseja a ordenaçãodvOrdenado.Sort = "Coluna5, Coluna2";// Um foreach para percorrer o DataView já ordenado
String coluna1;
String coluna2;foreach (DataRow drDados in dvOrdenado.Table.Rows){
//Dentro do foreach pode fazer o que quiser com os dados }
coluna1 = drDados["Coluna1"].ToString(); coluna2 = drDados["Coluna2"].ToString();
Bom divertimento. Add a comment
Regex - Validação de e-mail
Segue uma ótima regex para validação de e-mails com C#.
// Método que retorna verdadeiro se o e-mail for válido e falso caso não.
private bool ValidaEmail(string email){
// Expressão regular que vai validar os e-mails
string emailRegex = @"^(([^<>()[\]\\.,;áàãâäéèêëíìîïóòõôöúùûüç:\s@\""]+"
+ @"(\.[^<>()[\]\\.,;áàãâäéèêëíìîïóòõôöúùûüç:\s@\""]+)*)|(\"".+\""))@"
+ @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|"
+ @"(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";
// Instância da classe Regex, passando como
// argumento sua Expressão Regular
Regex rx = new Regex(emailRegex);
// Método IsMatch da classe Regex que retorna
// verdadeiro caso o e-mail passado estiver
// dentro das regras da sua regex.
return rx.IsMatch(email);
}
// Não esqueça de no início da sua classe importar o pacote abaixo.
using System.Text.RegularExpressions;
Lembrando que o código acima está escrito em C#, porém o uso de Regex é aceito na maioria das linguagens. Bom divertimento!
Add a comment