Desenvolvimento - C#
.NET Framework
Do ponto de vista dos programadores, a “.NET Framework” é o sistema operacional. É através dela que são invocadas todas as funções necessárias ao funcionamento dos programas, sob qualquer sistema operacional. Neste artigo irei analisar o seu papel e ver alguns exemplos de seu uso...
por Mauro Sant'AnnaDo ponto de vista dos programadores, a ".NET Framework" é o sistema operacional. É através dela que são invocadas todas as funções necessárias ao funcionamento dos programas, sob qualquer sistema operacional. Neste artigo irei analisar o seu papel e ver alguns exemplos de seu uso.
Funções do Sistema Operacional
Todo sistema operacional define as maneiras pelas quais os programas devem chamar suas funções.
O MS-DOS, por exemplo, define suas chamadas através de instruções assembly INT, passando e recebendo informações através de registradores da CPU. Mesmo que você, como programador de MS-DOS, jamais tenha escrito uma instrução INT, alguém fez isso para você. Estas instruções estão no código gerado pelo compilador ou, mais provavelmente, dentro da “biblioteca de runtime” do compilador “linkeditada” juntamente com seu programa. Isto vale para todas as linguagens como Clipper, C, Basic, Pascal e COBOL.
Em 1985, a Microsoft introduziu uma grande novidade em seu novo “ambiente operacional” Windows: a maneira de chamar o sistema era através de funções em linguagem de alto nível, a princípio usando a linguagem C. Não era mais necessário se preocupar com registradores da CPU. O Uso de funções em C foi sem dúvida uma grande vantagem e permitiu que o próprio Windows fosse bem mais complexo e capaz, visto que os programas poderiam usar seus recursos com maior facilidade.
O esquema de usar funções, no entanto, foi logo mostrando seus problemas. Um deles é que as funções não estavam formalmente agrupadas, nem mesmo para preservar o “handle” usado pelas mesmas funções. Por causa disto, logo surgiram “bibliotecas de classe” em C++, como a OWL da Borland e a MFC da própria Microsoft, para facilitar a programação. Lá por 1995, a MFC era de fato a “API do Windows”, pelo menos para criar a estrutura principal dos programas e suas janelas.
Por outro lado, ferramentas como Visual Basic e Delphi introduziram um modelo completamente diferente: o usuário manipulava métodos, propriedades e eventos de componentes, que por sua vez se responsabilizavam por chamar a API do Windows. Raramente o programador chamava a própria API diretamente.
Ficamos desta forma com três maneiras diferentes de programar para Windows:
- Diretamente na API, uma forma pouco usada pela alta complexidade e baixa produtividade;
- Com bibliotecas de classes como a MFC, um recurso disponível apenas em C++;
- Com componentes específicos como em Delphi e Visual Basic, uma maneira de alta produtividade, mas incompatível com outras ferramentas.
Vantagens da .NET Framework
A principal idéia da .NET Framework é usar um modelo baseado em componentes como a única maneira de programar para o sistema operacional. Este é o modelo mais flexível e produtivo entre todos os disponíveis, bastante semelhante do Delphi ou Visual Basic. Isto, no entanto não é uma tarefa fácil:
- O modelo de objetos deve ser definido no próprio sistema operacional;
- Devem ser suportadas várias linguagens de programação;
- Diversos conceitos como propriedades e eventos devem ser suportados nativamente, não apenas os métodos e campos, como normalmente ocorre;
- Criar instâncias e até mesmo herdar uma classe da outra deve ser permitido, mesmo que só tenhamos o código binário disponível e não saibamos sequer a linguagem de desenvolvimento da classe original;
- Os objetos devem ser “autodocumentados”; ou seja, incluir informações detalhadas dos tipos que estão lá dentro. Este recurso não só facilita a chamada das classes, mas também é fundamental para permitir a validação do uso e manutenção da integridade do sistema de tipos em tempo de execução;
- O gerenciamento de memória deve ser feito pelo sistema operacional, para que um programa possa “passar um objeto” para outro programa sem dificuldades e não precisar se preocupar com alocação de memória;
- Deve existir uma preocupação com controle de versões; um programa pode precisar de uma versão mais antiga e outro de uma versão mais nova da mesma classe; ambos devem ser satisfeitos, mesmo que estejam rodando ao mesmo tempo.
O esquema acima é muito semelhante ao implementado pelo Delphi da Borland quando usamos “pacotes de runtime”.
Vale lembrar que os desafios acima foram enfrentados sem sucesso pela “Next”, empresa fundada pelo Steve Jobs depois que ele saiu da Apple e também pela Taligent, esforço comum da Apple e IBM para criar justamente um “framework universal”.
Para encarar o desafio, a Microsoft colocou à frente do projeto a pessoa que já tinha liderado um projeto semelhante com sucesso: Anders Hejlsberg, o criador do Delphi. Pode-se dizer que os “pacotes de runtime” do Delphi são um “protótipo” do que foi feito no “.NET Framework”. No entanto o “.NET Framework” foi bem além do que existia no Delphi:
- São suportadas diversas linguagens de alto nível: é possível criar um componente em uma linguagem, C# por exemplo, e uma classe derivada em outra, VB por exemplo;
- Os componentes e sua descrição (Metadata) estão sempre no mesmo arquivo e não podem ser separados;
- O gerenciamento de memória é feito pelo sistema operacional e não pelos programas;
- O sistema de tipos não pode jamais ser violado; os “casts inseguros” não existem;
- Os tipos “simples” com o inteiro e “double” podem ser “derivados” de um ancestral comum ter propriedades e métodos. Isto é feito sem que haja um custo adicional para usos mais simples, como operações aritméticas;
- O suporte a “reflections” (informações de tipo em tempo de execução) foi bastante expandido;
- Todo “executável .NET” (na verdade chamados de “assemblies”) possuem, além do nome, informações detalhadas de versões em três partes: número principal, secundário e de manutenção. Existe um mecanismo sofisticado de resolução de versões, baseado em regras (heurísticas) do sistema operacional, incluindo também sugestões do programa, como por exemplo “use a versão de manutenção mais nova a não ser que o programa exija uma versão específica”;
Os executáveis .NET são independentes do sistema operacional. Basta que haja um “sistema de runtime” que possa compilar os programas para a CPU real e que as classes necessárias estejam implementadas para o programa rodar. Nada nos programas compilados os amarra a alguma CPU ou sistema operacional.
Usando as classes
Dadas às necessidades e complexidade dos programas atuais, existem literalmente centenas de classes oferecendo diversos “serviços”, como por exemplo:
- Acesso a arquivos;
- Conexões TCP/IP;
- Gerenciamento de janelas e controles;
- Segurança;
- Desenho e impressão;
Usar as classes da biblioteca é algo simples. Em geral, basta criar um objeto da classe desejada e chamar seus métodos e propriedades. Veja no Quadro 1 um exemplo em C# para mostrar o conteúdo de um arquivo na console.
Listagem 1 Exemplo de Programa que usa a Fremework
// Programa C# para exibir um arquivo na console // Este programa usa uma classe da .NET FrameWork // Indica que "namespaces" estào sendo referidos using System; using System.IO; public class Class1 { public static int Main(string[] args) { // Cria objeto para ler arquivos. Note que não é necessário liberar o objeto criado StreamReader L = new StreamReader(@"c:\odbcconf.log"); // lê o arquivo todo e coloca-o em uma variável com um métododa classe string S = L.ReadToEnd(); // Exibe na console Console.WriteLine(S); return 0; } }
Conclusão
A .NET Framework é uma biblioteca de classes que reúne as todas as funções normalmente associadas ao sistema operacional. Ele resolve muitos problemas da API do Windows, sendo baseada em um modelo de componentes utilizado com sucesso no Visual Basic e no Delphi.