Posts Marcados C#
C# e os Delegates.
Publicado por julianomarcon em Sem categoria em 25 de janeiro de 2010
Pensei em escrever algumas informações sobre Delegates aqui, mas como a filosofia da plataforma .net é não reinventar a roda, procurei e encontrei um artigo recém escrito sobre o tema e com certeza é uma das melhores explicações que encontrei. Parabéns ao autor por este incrivel artigo.
Criptografia Rijndael em C#
Publicado por julianomarcon em Sem categoria em 8 de janeiro de 2010
public class Criptografia
{
/// <summary>
/// Vetor de bytes utilizados para a criptografia (Chave Externa)
/// </summary>
private static byte[] bIV = { 0x50, 0x08, 0xF1, 0xDD, 0xDE, 0x3C, 0xF2, 0x18,
/// <summary>
/// Representação de valor em base 64 (Chave Interna)
/// </summary>
private const string cryptoKey =
"Q3JpcHRvZ3JhZmlhcyBjb20gUmluamRhZWwgLyBBRVM=";
// O Valor acima representa a transformação para base64 de
// A chave é: "Criptografias com Rijndael / AES"
/// <summary>
/// Metodo de criptografia de valor
/// </summary>
/// <param name="text">valor a ser criptografado</param>
/// <returns>valor criptografado</returns>
public static string Encrypt(string text)
try
{
if (!string.IsNullOrEmpty(text))
byte[] bText , bKey;
Convert.FromBase64String(cryptoKey);
new UTF8Encoding().GetBytes(text);
Rijndael rijndael = new RijndaelManaged();
MemoryStream mStream = new MemoryStream();
CryptoStream encryptor =
new CryptoStream(
CryptoStreamMode.Write);
// Pega o vetor de bytes da memória e gera a string criptografada
return Convert.ToBase64String(mStream.ToArray());
else
{
return null;
catch (Exception ex)
throw new ApplicationException("Erro ao criptografar" , ex);
/// <summary>
/// Metodo de descriptografia
/// </summary>
/// <param name="text">texto criptografado</param>
/// <returns>valor descriptografado</returns>
public static string Decrypt(string text)
try
{
if (!string.IsNullOrEmpty(text))
{
byte[] bText , bKey;
bKey = Convert.FromBase64String(cryptoKey);
Convert.FromBase64String(text);
Rijndael rijndael = new RijndaelManaged();
CryptoStream decryptor =
new CryptoStream(
mStream ,
rijndael.CreateDecryptor(bKey , IV) ,
CryptoStreamMode.Write);
UTF8Encoding utf8 = new UTF8Encoding();
return utf8.GetString(mStream.ToArray());
else
{
return null;
catch (Exception ex)
{
throw new ApplicationException("Erro ao descriptografar" , ex);
Acredito que o código esteja bem documentado.
Maiores informações sobre o algoritmo veja:
http://pt.wikipedia.org/wiki/AES
E uma animação MUITO BOA sobre o processo que o algoritmo faz pode ser encontrada em: http://blog.ultrassecreto.com/?p=17
Tipos de dados em C#
Publicado por julianomarcon em Sem categoria em 2 de janeiro de 2010
Em C#, todo tipo é derivado da classe System.Object, que constitui o núcleo do sistema de tipos de C#. Entretanto, os projetistas da linguagem, e não apenas da linguagem, mas de .NET como um todo, sabem perfeitamente das implicações de ter um sistema de tipos onde tudo é um objeto: queda de desempenho. Para resolver este problema, eles organizaram o sistema de tipos de duas formas:
· Tipos Valor: variáveis deste tipo são alocadas na pilha e têm como classe base System.ValueType, que por sua vez deriva de System.Object.
· Tipos Referência: variáveis deste tipo são alocadas na memória heap e têm a classe System.Object como classe base.
Veja a hierarquia de tipos do C#
Namespaces em C#
Publicado por julianomarcon em Sem categoria em 29 de dezembro de 2009
Namespaces são a forma lógica de organizar o código-fonte em .NET. Toda a biblioteca de classes da .NET está estruturada em uma hierarquia de namespaces que tem como base o namespace System, onde se encontram as classes básicas da .NET. Fisicamente, os namespaces são armazenados em assemblies, que, por sua vez, são armazenados no sistema de arquivos como DLLs (bibliotecas de ligação dinâmica) ou como arquivos executáveis (.exe) que correspondem a aplicações propriamente ditas no ambiente .NET.
Quando uma aplicação é organizada logicamente usando namespaces, este deve possuir pelo menos uma classe que implemente o método Main( ), para aplicações console, ou WinMain( ), para aplicações Windows. Por sua vez, uma biblioteca de classes é implementada usando namespaces, mas nenhuma das suas classes membros implementa o método Main( ) ou WinMain( ), e elas são usadas para implementar código reutilizável.
Assim como as classes contêm membros, os namespaces também, os quais podem ser dos seguintes tipos:
Ainda podemos usar a cláusula using para criar um alias de um namespace quando, ao incluirmos dois namespaces diferentes, a referência a um dos membros cujo identificador existe em ambos namespaces se torna ambígua pelo fato de que os nomes são idênticos. No exemplo a seguir, vamos assumir que o namespace1 e namespace2 contêm ambos uma classe chamada clA. Vejamos o código para entendermos melhor o problema:
using namespace1;
using namespace2;
clA ClasseA1 = new A( );
clA ClasseA2 = new A( );
Mas o problema é que o compilador não sabe a partir de qual classe desejamos criar uma instância, se a pertencente ao namespace1 ou ao namespace2. Podemos resolver esse problema de duas formas, vejamos:
Solução 1:
using namespace1;
using namespace2;
namespace1.clA ClasseA1 = new A( );
namespace2.clA ClasseA2 = new A( );
Resolvemos o problema qualificando completamente o nome da classe, ao incluirmos o nome do namespace ao qual pertence. O problema desta solução é que se o nome do namespace for muito grande, por exemplo System.Collections. Specialized, e a classe clA tiver muitos membros estáticos, teremos que digitar o nome do namespace a cada vez que quisermos referenciar a classe.
Solução 2:
using NA1 = namespace1;
using NA2 = namespace2 ;
NA1.clA ClasseA1 = new A( );
NA2.clA ClasseA2 = new A( );
Na solução 2 usamos um alias para o namespace e dessa forma resolvemos a chamada ambígua da classe clA.