msdn25_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

BigInteger, GetFiles e mais

 

Pergunta - Preciso trabalhar com números grandes, maiores que os tamanhos permitidos por UInt64. O Microsoft® .NET Framework tem algum suporte para isso?

Resposta - As bibliotecas de classe básicas não expõem publicamente nenhuma biblioteca para tratamento de números grandes, embora algumas das classes relacionadas a criptografia façam uso de uma implementação para esse tipo de tratamento. Porém, nem tudo está perdido. Apesar de podermos procurar na Web e achar uma grande quantidade de implementações em C#, C++ e várias outras linguagens, isso não é necessário. Se você não se importa da dependência quanto às bibliotecas J#, então já tem a sua disposição um grande número de implementações. Na realidade, você tem dois.

A biblioteca J# de tempo de execução vjslib.dll, está disponível como um componente redistribuível, semelhante ao .NET Framework. O download pode ser feito em msdn.microsoft.com/vjsharp/downloads (também instalada como um pré-requisito pelo Visual Studio). Da mesma maneira que uma aplicação C# ou C++ pode fazer uso do Microsoft.VisualBasic.dll (a biblioteca de tempo de execução do Visual Basic), C#, Visual Basic e aplicações C++ podem usar a biblioteca J# de tempo de execução e as numerosas classes interessantes que expõe.

Alguns usam as bibliotecas “zip” J# para atender as suas necessidades de compressão, mas além disso, há algumas “pedras preciosas” muito interessantes escondidas na biblioteca. Para suas necessidades, sugiro que você veja a classe java.math.BigInteger (uma classe BigDecimal também está disponível). Aqui vai um exemplo do uso de BigInteger, mostrando que pode ser usado com valores maiores do que o UInt64:

 

BigInteger i = new BigInteger(ulong.MaxValue.ToString());

BigInteger iSquared = i.multiply(i);

Console.WriteLine("i:\t" + i);

Console.WriteLine("i^2:\t" + iSquared);

 

Isto produz a seguinte saída:

 

i:    18446744073709551615

i^2:  340282366920938463426481119284349108225

 

BigInteger expõe um número grande de operações. Isso inclui as operações padrão, como adição, subtração, multiplicação e divisão, e também expõe funcionalidades como a habilidade para achar o MDC de dois BigIntegers, fazer teste de números primos, teste de bit set e conversão para outros tipos de dados. Considerando isso tudo, é uma classe muito útil.

Claro que uma resposta para esse assunto não estaria completa sem uma importante advertência. A maior parte das pessoas que solicita tais primitivas está querendo construir as suas próprias operações criptográficas. Não faça isso. Você estará provavelmente entrando em um mundo de problemas. Ao invés disso, use as classes do namespace System.Security.Cryptography. Se essas não satisfazerem suas necessidades (o que pode acontecer), considere o uso da API não gerenciada Crypto. Se ainda não for suficiente, procure por implementações de vendedores confiáveis. Não crie as suas próprias.

Se estiver considerando explorar a vjslib.dll, olhe com mais atenção. Há muitas classes interessantes já disponíveis que poderiam ajudar nos seus projetos.

 

Pergunta - tenho um atributo que uso nas classes, para auxiliar no processo de desenvolvimento, mas não desejo que essa informação fique exposta ao público. Para tal, tenho encapsulado todas as aplicações do atributo com a diretiva de compilação DEBUG:

 

#if DEBUG

[MySecretAttribute("dado privado")]

#endif

public class MyClass { ... }

 

Esse é o melhor modo?

 

Resposta - No .NET Framework 1.x sim, você não vai achar nada muito melhor. Porém, o .NET Framework 2.0 adiciona suporte para aplicar condições em atributos. Em outras palavras, você pode assinar seus atributos personalizados com o ConditionalAttribute (DEBUG) e qualquer aplicação que contém o atributo só será compilada em construções com a “flag” DEBUG. Para exemplificar isso, compilei o código da Listagem 1 em um build de depuração e também em um build de release. A Figura 1 mostra os resultados ao rodar o ILDASM em cada um dos executáveis resultantes. O primeiro screenshot mostra o build de depuração e, como podemos ver, o atributo foi compilado. O screenshot de baixo é o build release e, como desejado, não tem o atributo. Esse é excelente novo recurso do compilador.

 

Listagem 1. Usando compilação condicional em atributos

using System;

using System.Diagnostics;

[MySecret("private data")]

class Program

{

    static void Main() { }

}

[AttributeUsage(AttributeTargets.Class)]

[Conditional("DEBUG")]

...

Quer ler esse conteúdo completo? Tenha acesso completo