Reflection e os Atributos Customizados
Para começarmos a falar de Reflection é imprescindivel entender melhor o conceito da “coisa”.
A Reflexão permite que você conheça um objeto pelo seu tipo (Type) e dentro do seu tipo ter acesso a praticamente tudo o que o objeto te fornece. A Reflexão é resolvida toda em tempo de execução e daí que surgem classes ou métodos do tipo genérico. Desta forma temos a possibilidade de além de acessar, os seus métodos, acessar os encapsulamentos e até mesmo enviar novos valores para o objeto em tempo de execução.
Isto soa como sem novidade alguma, afinal fazemos isso todo o tempo, mas sempre devemos respeitar o TypeSafe do C#. Em métodos genéricos, nós estamos caminhando em um nível onde, todos são aceitos independente do seu Tipo.
Para entendermos um pouco melhor essa brevissima teoria, nada melhor do que a prática.
Lembre-se de instanciar a namespace:
using System.Reflection;
static void Main(string[] args)
{
//Vamos capturar o tipo da classe Math
Type Tipo = typeof(Math);
//Vamos capturar os Valores de PI e E, que são variaveis const da classe Math.
FieldInfo[] field = Tipo.GetFields();
foreach (FieldInfo Campo in field)
{
Console.WriteLine(Campo.Name + "=" + Campo.GetValue(typeof(Math)).ToString());
}
Console.ReadKey();
}
O Foreach resultou hein:
Atributos Customizados
Este assunto é pouco falado, até mesmo sua utilização se torna um pouco restrita. Tive algumas idéias para a utilização deste e portanto gerou um artigo.
Mas o que são esses atributos?
Atributos da Classe
Estes atributos você encontra sobre a declaração de uma classe. Por Exemplo:
[Obsolete]
internal class Atributos
{
}
Obsolete é um atributo da classe que defini que a mesma é ultrapassada. Quando estamos criando um serviço em WCF no framework 3/3.5, nós somos obrigados a declarar os atributos, como no exemplo a seguir:
WCF–Primeiros Passos
O que é WCF?
O WCF é um SDK para desenvolvimento e distribuição de serviços no windows. WCF fornece um RUNTIME permintindo expor serviços do tipo CLR (Commom language Runtime) e consumi-los. WCF implementa um conjunto de padrões que definem a interação entre serviços, tipos de dados e protocolos de comunicação. Ele possue uma estrutura exigida por quase todos os aplicativos, possibilitando alta produtividade. A instância de serviços, chamadas assincronas, chamadas desconectadas em fila, seguança e interoperalibidade, são algumas das possibilidades possiveis. Neste cápitulo focarei nas formas de transação existentes e iremos evoluindo conforme possível.
O que é um Serviço WCF?
Parte do WCF que está exposto ao mundo. Este serviços podem ser Remotos ou Locais. A estrutura de um serviço consiste de uma inteface do contrato. A classe do contrato possuí assinaturas dos métodos, entretanto vou extender este assunto breve.
Já que sabemos que o serviço pode ser Remoto (Internet, Intranet), Local (Localhost, 127.0.0.1), vamos entrar citar cada tipo de comunicaçao exitente.
Tipo de Comunicação
Endereços TCP
Este é o primeiro dos tipos, o TCP, como cada comunicaçao tem um padrão para o TCP é o seguinte:
Ex: Tipo de comunicação://Endereço:Porta/Servico
net.tcp://localhost:7888/MeuServico
Caso a porta não seja informada seu padrão é: 808.
Este protocolo permite que dois serviços atenda a mesma porta, mas falaremos em outra ocasião.
Endereços HTTP
http://localhost:7888
Caso a porta não seja informada, o padrão é a porta: 80
Endereços IPC
Este protocolo utiliza o mecanismo de Pipes nomeados do windows, este tipo de comunicação apenas aceita chamadas do próprio computador, portanto é necessário informar o nome da máquina ou localhost. Este só será aberto uma única vez por máquina, não tendo possibilidade de compartilhar a mesma porta para este mesmo tipo de comunicação e nenhuma outra.
net.pipe://LocalHost/Canalizacao
Endereços MSMQ (Microsoft Message Queue)
Utilizado quando necessitar de fila de mensagens, você deve informar o nome da fila.
Caso seja necessário utilizar filas privadas, isto deve estar explicito no endereço: net.msmq://localhost/private/MinhaFila
Para as públicas, simplesmente omita seu tipo:
net.msmq://LocalHost/MinhaFila
É isso por enquanto, Obrigado.
Extesion Methods
Esse assunto é bem legal e simples, como verão abaixo. Uma classe de extensão, permite que gere novos métodos para as váriaveis do projeto como acontece em .ToString(), .ToUpper(). Pemitindo costumizar o codigo ao seu gosto, centralizando seus métodos em uma classe externa.
No exemplo abaixo vou fazer um método de extensão chamado CamelCase, que retornorá todo o texto incluso dentro das normas do CamelCase, para aqueles que não sabem:
CamelCase é a denominação em inglês para a prática de escrever palavras compostas ou frases, onde cada palavra é iniciada com Maiúsculas e unidas sem espaços. É um padrão largamente utilizado em diversas linguagens de programação, como Java, Ruby, PHP e Python, principalmente nas definições de Classes e Objetos. Pela sua associação com tecnologia, o marketing se apropriou dessa maneira de escrever, injetando certo ar de "tecnologia" nos produtos assim nomeados: iPod, GameCube, OpenOffice.org, StarCraft, dentre outros. (Fonte)
Vamos ao exemplo
public static class ExtensionMethods
{
public static String CamelCase(this String source)
{
string[] arr = source.Split(new char[] { ' ', ',', '.', '_', '-' });
String Retorno = string.Empty;
foreach (String item in arr)
{
Retorno += item.Substring(0, 1).ToUpper() + item.Substring(1, item.Length - 1).ToLower();
}
return Retorno;
}
}
Repare que o método pode estar em qualquer classe do tipo static , o compilador ao entepretar o This na entrada dos parâmetros, reconhecerá em seguida este método como de extensão, independentemente do nome da sua classe ou namespace. Para sanar esta possivel dúvida eu gerei uma classe dento do namespace da página Default.aspx.cs, e ambos foram reconhecidos como extensão.
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
String Case = "toDo Mundo sabE quE o camEl case-tem a primeira_letra de cada nova palavra como_maíuscula e sem espaço";
int Numero = 12031202;
Response.Write(Case.CamelCase());
Response.Write(Numero.ParOuImpar());
}
}
}
public static class RobsonAlves
{
public static String ParOuImpar(this int Numero)
{
if (Numero % 2 == 0)
return "PAR";
else
return "IMPAR";
}
}
è isso ai, os métodos de extensão são bem legais e simples, vale agora ter a necessidade de usar mais esta.
Obrigado.
Encontre no Texto com Expressões Regulares
Vou mostrar aqui 4 exemplos simples que captura texto, grupo de texto e faz replace dentro de um trecho via Expressão Regular
As ER's transferem um poder gigantesco quando necessitamos desta tarefas e até mesmo na geração de mascarás para textbox.
O REGEX possui algumas opções e é muito importante entender a funcionalidade de cada um para utilizar o ER da melhor forma:
http://msdn.microsoft.com/en-us/library/yd1hzczs(v=VS.100).aspx
Vamos a prática.
Buscando Texto
String Fonte = "aonde Quer Vá, Aonde Quer Que Seja, Ande com as pés";
private void buscaTexto()
{
// Instância do Regex e a palavra que vamos buscar na fonte.
Regex regex = new Regex("Aonde");
// Armazena a coleção de Expressões Casadas.
MatchCollection coll = regex.Matches(Fonte);
foreach (Match item in coll)
{
lblResults.Text += String.Format(" Encontrei a palavra {0} na posição {1} e Termina na Posição {2}",
item.Value.Trim(), item.Index, item.Index + item.Value.Length);
}
}
Quantidade de Letras por palavras
String Fonte = "aonde Quer Vá, Aonde Quer Que Seja, Ande com as pés";
private void buscaTextoQtdLetras()
{
//Busca por palavras que contenha apenas Letras Maiuscula e Minuscula
// e tenham 3 ou mais caracteres.
Regex regex = new Regex("[a-zA-Z]{5,}");
// Armazena a coleção de Expressões Casadas.
MatchCollection coll = regex.Matches(Fonte);
foreach (Match item in coll)
{
lblResults.Text += String.Format(" Encontrei a palavra {0} na posição {1} e Termina na Posição {2} Que Possui {3} ou Mais", item.Value.Trim(), item.Index, item.Index + item.Value.Length, item.Value.Length);
}
}
Extraindo Grupo do Text
private void ExtraindoPorGrupos()
{
String End = "1234 Cherry Lane, USA" + Environment.NewLine + "1234 Apple Tree Drive, Smalltown, USA " + Environment.NewLine + "3456 Chry Orchard streetm Smalltown, USA";
//Busca da esquerda pra direita após os numeros o nome da rua, pegando os espaços \\s entre as letras e pegando todas,
//ignorando a virgula e tudo que vem após a mesma.
Regex regex = new Regex("^(?\\d+)\\s*(?[\\w\\s]*)", RegexOptions.Multiline);
MatchCollection coll = regex.Matches(End);
foreach (Match item in coll)
{
string Rua = item.Groups["Rua"].Value;
String Numero = item.Groups["Numero"].Value;
lblResults.Text += ""+ String.Format("Rua : {0} ", Rua);
lblResults.Text += "" + String.Format("Número :{0} ", Numero);
}
}
Replace Com Regex
private void ReplaceTexto()
{
Regex regex = new Regex("^[aA]\\w+");
lblResults.Text += "" + regex.Replace(Fonte, "Por Onde");
}
Após rodar a aplicação o seguinte resultado é gerado:
Muito legal, acredito que isto ajudará a ter noção do que da pra ser feito com Regex e Expressões Regulares, compensa sim dar uma estuda na sintaxe ER para .Net.
Obrigado.
Session State
Vou falar um pouco dos tipos de status existentes nas sessions geradas na aplicação
Por Que Se Preocupar?
Os tipos de session possuim certas limitações que devem ser consideradas, após analisar o nível de acesso que o sistema terá ao longo do tempo, o tipo de hospedagem que este terá (Caso seja por terceiros), trâfego absoluto que o site tem.
Tudo isto deve ser levado em consideração na hora de utilizar Session em um sistema, a seguir ficará mais claro os porquês desta preocupação.
Quais são os tipos ?
Os tipos são:
Inproc: Considerado o mais rápido dos tipos existente, por manter objetos em memória junto com o processo do ASP.Net.
StateServer: Aqui toda a sessão é serializada, assim tendo uma perca de performace quando comparado ao InProc, entretanto existe a possibilidade de enviar esta sessão para outro servidor tornar-se resposável pelo armazenamento destas informações, podendo assim ser uma boa escolha. Largamente recomendado quando existe um grande fluxo de usuário no site.
Para utilizar este serviço, procure nos serviços do Windows o processo chamado: ASP.NET State Services, para tal digite no executar, services.msc.
Para descobrir a porta do servidor qual será configurado para armazenar é necessário encontrar nos registros o mesmo.
SQLServer: Sim, a session é armazenada em banco de dados, e possuí também certa desvatagem performática, quando comparado ao Inproc, entretanto esta forma permite que a sessão seja recuperada desde que dentro da “Validade” da sessão gerada.
Para informar o tempo que será válida a sessão, assim como qual servidor atendará no armazenamento das informações das sessões ou qual o servidor e instâncias que será utilizado.
Web-Config
Para cada tipo respectivamente, segue como deve ser declarado no Web.Config.
Inproc:
<system.web>
<sessionState
mode="InProc"
timeout="1"
cookieless="false">
</sessionState>
</system.web>
StateServer:
<sessionState mode="StateServer" cookieless="false" stateNetworkTimeout="20" stateConnectionString="127.0.0.1:42424"> </sessionState>
SqlServer
<sessionState mode="StateServer" timeout="20" cookieless="false" sqlConnectionString="Data Source=127.0.0.1;Trusted_Connection=Yes;"> </sessionState>
Usando o Cookieless igual a "False", quer dizer que será gerado junto com a sessão Cookies.
Eu iria listar vantagem e desvantagens de cada um, mas isso tornaria uma análise extremamente pessoal, e como foi citado inicialmente isso deve ser utilizado após a análise das necessidades do sistema.
Para buscarem mais detalhes sobre este assunto:
http://www.codeproject.com/KB/aspnet/ExploringSession.aspx
Obrigado.
Quick Post – Null Coalescing Operator
Sim, o FrameWork 4.0 tem novidades que eu considero muito interessante, estou estudando de forma prática algumas das novidades, esta aqui me fez escrever um Quick post.
Veja:
Esta Sintaxe:
public class CoalEscingNullOperator
{
public int? Variavel { get; set; }
public void TestandoNullOperator()
{
Variavel = null;
//Validação
if (Variavel != null)
{
Variavel = Variavel;
}
else
{
Variavel = 1;
}
//CoalEscingNull
Variavel = Variavel ?? 1;
}
}
Veja que com uma linha você tem o memso efeito que um bloco IF..Else!
Abraços.
Gerando Novas Thread .Net (MultThreading)
Pois é, mas o que é uma Thread?
Segundo o Wikipedia: (Fonte)
Linha de execução (em inglês: Thread), é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente. O suporte à thread é fornecido pelo próprio sistema operacional (SO), no caso da linha de execução ao nível do núcleo (em inglês:Kernel-Level Thread (KLT)), ou implementada através de uma biblioteca de uma determinada linguagem, no caso de uma User-Level Thread (ULT).
Uma linha de execução permite que o usuário de programa, por exemplo, utilize uma funcionalidade do ambiente enquanto outras linhas de execução realizam outros cálculos e operações.
Em hardwares equipados com uma única CPU, cada linha de execução(Thread) é processada de forma aparentemente simultânea, pois a mudança entre uma linha e outra é feita de forma tão rápida que para o usuário isso está acontecendo paralelamente. Em hardwares com multiplos CPUs ou multi-cores as linhas de execução(Threads) podem ser realizadas realmente de forma simultânea;
Os sistemas que suportam apenas uma única linha de execução são chamados de monothread e aqueles sistemas que suportam múltiplas linhas de execução são chamados de multithread.
Então abaixo fiz um exemplo onde executo três Threads, três criadas dinâmicamente e a Main.
Veja que a última thread ela chama um método com parâmetros, existe a possibilidade de se passar qualquer tipo de parâmetro, neste caso eu preciso de uma entrada no método como Object e dentro dele eu converto para o tipo que me interessa. Portanta atente-se neste caso e pesquisam outras formas de fazer a passagem de parâmetro.
È um processo muito interessante que resulta em ganhos de desempenho tudo graças ao MultThread do .Net. Claro que outros assuntos então poderiam ser abordados como a Programação Paralela, foco da nova estrutura do Framework 4.0, portanto para quem sentiu interesse podem buscar informações sobre (PLINQ – Paralelism )
Segue Código:
public class Program
{
static void Main(string[] args)
{
//Thread novaThread = new Thread(EscrevaNovaThread);
//novaThread.Start();
//for (int i = 0; i < 100; i++)
//{
// Console.WriteLine("Main {0}", i);
// novaThread.Priority = ThreadPriority.Highest;
//}
Thread ThreadOne = new Thread(EscrevaNovaThread);
ThreadOne.Name = "ThreadOne";
ThreadOne.Start();
Thread ThreadTwo = new Thread(EscrevaNovaThread);
ThreadTwo.Name = "ThreadTwo";
ThreadTwo.Start();
Thread.CurrentThread.Name = "Main";
EscrevaNovaThread();
Thread ThreadThree = new Thread(new ParameterizedThreadStart(EscrevaThreadParametros));
ThreadThree.Start("Robson Alves");
Console.Read();
}
public static void EscrevaThreadParametros(object Nome)
{
foreach (var item in (string)Nome)
{
Console.Write(item.ToString());
Console.Read();
}
}
public static void EscrevaNovaThread()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Nova Thread is On {0} - Name of Thread - {1} ", i, Thread.CurrentThread.Name);
if (i == 50 && Thread.CurrentThread.Name == "ThreadOne")
{
System.Threading.Thread.CurrentThread.Abort();
}
}
Console.Read();
}
}
Obrigado!
Expressões Regulares
Um dos estudos recentes que estou pondo em prática, acredito no poder da expressão regular e na sua importância, apesar de ter outras formas mais “Humanas” de se fazer a mesma coisa, é importante termos o conhecimento dessas expressões, como já aconteceu comigo, se deparar com JavaScript transbordando expressões regulares, então decidi por em prática o que venho lendo e aprendendo com a comunidade.
Vamos ao que interessa:
Eu criei um programa utilizando windows form que efetua a validação de Regex digitado, nada além do que existe na internet hoje. O fonte estará disponibilizado para download no final da página.
Fazer Expressão regular é uma arte que se deve ter uma grande atenção e abastração do que você precisa recolher em um texto.
Para buscamos em uma linha inteira utilizamos os (\b) que se atentam a buscar nas bordas da linha todo o contêudo entre elas.
Então sabendo disso vamos buscar em uma texto a existência de algumas palavras, segue a Expressão:
^.*\b(Robson|domingo|relatos)\b
Então você indica pra ele, pegue do inicio e do fim da linha e qualquer caracter, porém só vou casar com essa linha se nela exister Robson ou domingo ou relatos. Então ao digitar a linha com uma ou mais dessas palavras ele irá retornar para você
Segue uma lista dos metacaracteres e algumas referências no assunto:
meta Descrição
___________________________
. ponto
[] lista
[^] lista negada
? opcional
* asteristico (Coringa0
+ mais
{} chaves
^ circunflexo (Começo da Linha) âncora
$ cifrão (final da linha) âncora
\b borda (Bordas da linha) âncora
\ escape (Escapar metacaracteres)
| ou
() grupo
\n retrovisor
Este assunto envolve mais prática do que a teroria, apenas tente entender os por quês de cada metacaracter e pratiques.
Referências do Assunto:
http://www.linhadecodigo.com.br/artigo/2015/Express%C3%B5es-Regulares-Armamento-Pesado.aspx
Este é o livro do @oreio : http://www.memelo.org/tmp/docs/perl/guia-er.sourceforge.net/guia-er-1.html
Download do Fonte: http://tinyurl.com/24sj22c:
Comentem
.