PARTE I A Linguagem C# Capítulo 1, C# 3.0 e o.net 3.5 Capítulo 2, Iniciando: Hello World Capítulo 3, Fundamentos da Linguagem C# Capítulo 4, Classes e Objetos Capítulo 5, Herança e Polimorfismo Capítulo 6, Sobrecarga de Operador Capítulo 7, Estruturas Capítulo 8, Interfaces Capítulo 9, Arrays, Indexadores e Coleções Capítulo 10, Strings e Expressões Regulares Capítulo 11, Exceções Capítulo 12, Delegados e Eventos
CAPÍTULO 1 C# 3.0 e.net 3.5 O Objetivo do C# 3.0 é fornecer uma linguagem simples, segura, moderna, orientada a objetos, focada em internet e de alta performance para desenvolvimento.net. C# é agora uma linguagem totalmente madura, e isso é demonstrado nas lições aprendidas através de três décadas. Muito da mesma forma que você observa numa criança as características e personalidade de seus pais e avós, você facilmente observa no C# a influência do Java, C++, Visual Basic (VB), e outras linguagens, mas também pode observar as lições aprendidas desde a primeira apresentação do C#. O foco deste livro é o C# 3.0 e sua utilização como ferramenta para programação em plataforma.net, especificamente e especialmente com Visual Studio.NET 2008. Muitos dos programas neste livro são escritos como aplicativos de console (ao invés de aplicativos Windows ou web) para facilitar a concentração nas características da linguagem ao invés de estar distraído com a interface com o usuário. Este capítulo apresenta tanto a linguagem C# como a plataforma.net, incluindo o.net Framework 3.5. A Evolução do C# Cada geração do C# tem trazido adicionais relevantes à linguagem, com poucas excelentes funções. Talvez a mais significativa função adicionada para o C# 2.0 foi Generics (permitindo um aperfeiçoamento de segurança de tipo quando lidando com collections - coleções). Desta forma, a adição mais significativa ao C# 3.0 deve ser a extensão de Consulta de Linguagem Integrada (LINQ, Language-Integated Query), que adicionam ao C# extensões de consulta de dados de finalidade geral; embora não seja a única melhoria do C#. Outras novas características incluídas: Expressões Lambda (delegates anonimos nos steroids) Métodosde Extensão Inicializadores de Objeto Tipos anônimos Variáveis locais de tipo implícito Vetores de tipo implícito Árvores de Expressão Propriedades Automáticas (uma pequena jóia) A Linguagem C# A essência da linguagem C# é tranquilizadoramente simples, com pouco mais de 100 palavras chave e uma dúzia de tipos internos de variáveis, mas é altamente expressiva quando vem a implementar conceitos modernos de programação. C# inclui 3
todo o suporte para programação estruturada, com componentes funcionais e de orientação a objetos que você espera de uma linguagem moderna construída a partir do C++ e Java. Versão 3.0 tem sido estendida de três formas muito importantes: Total suporte para LINQ consultas em relação a dados, agora fazem parte da linguagem. Total suporte para sintaxes declarativas do Windows Presentation Foundation (WPF; para criação de aplicações ricas do Windows), Work Flow (WF), e Silverlight (para criação multi-plataforma e multi-navegadores de aplicações ricas de Internet) Muitas funções convenientes adicionadas para auxiliar a produtividade do programador e para funcionar e rodar corretamente no Visual Studio 2008 Um Pouquinho de História A linguagem C# foi originalmente desenvolvida por um pequeno time conduzido por dois engenheiros da Microsoft, Anders Hejlsberg e Scott Wiltamuth. Hejlsberg é também conhecido pela criação do Turbo Pascal, uma linguagem popular para programação PC, e por liderar o time que arquitetou o Borland Delphi, um dos primeiros vitoriosos Ambientes de Desenvolvimento Integrados (Integrated Development Environments, IDEs) para programação cliente/servidor. Características do C# No coração de qualquer linguagem orientada a objetos, está seu suporte para definir e trabalhar com classes. Classes determinam novos tipos, permitindo que você estenda a linguagem e consiga manipular melhor o problema que você está tentando solucionar. C# contém palavras-chave para declaração de novas classes e de seus métodos e propriedades e para implementação de encapsulamento, polimorfismo, os três pilares da programação orientada a objetos. No C#, tudo relacionado a uma declaração de classe localiza-se na própria declaração. Definições de classe C# não necessitam de arquivos de cabeçalho ou arquivos serparados (IDL, Interface Definition Language). Além disso, o C# permite documentação direta (inline) que simplifica a criação online e impresa de documentação para um aplicativo. C# também permite interfaces, um meio de fazer um contrato com uma classe para processos que a interface determina. No C#, uma classe pode herdar de apenas um objeto pai (parent), mas uma classe pode implementar múltiplas interfaces. Quando uma classe implementa uma interface, na prática promete proporcionar funcionalidade que as interfaces especificam. C# proporciona também um suporte a structs (estruturas), um conceito que tem mudado seu significado de forma relevante a partir do C++. No C#, uma estrutura é um limitado tipo supérfluo que quando instanciado, faz menos pedidos ao sistema operacional e à memória, do que uma classe convencional faz. Um struct pode herdar de uma classe ou ser herdada por uma classe, mas um struct pode implementar uma interface. Este livro demonstrará o porquê de eu não considerar structs tão importantes no mundo dos Generics (Genéricos). A verdade é que não coloquei uma struct em programas por cinco anos, exceto para demonstrar como é feita sua utilização. C# proporciona suporte total de delegates (delegados): para invocação de métodos indiretamente. Em outras palavras, como no C++ você pode achar funcionalidade similar (como em ponteiros para funções de membros), mas delegates são referência de tipos seguros que encapsulam métodos com assinaturas e tipos de retorno específicos. Delegates têm sido extendidas significativamente, primeiro no C# 2.0 e novamente no C# 3.0, primeiramente com anonymous delegates e agora com as Expressões Lambda (Lambda expressions), colocando a base para o LINQ. Nós explicaremos à fundo nos Capítulos 13 e 15. C# proporciona características orientadas a componentes, como propriedades, eventos e construtores declarativos (como atributos). Programação orientada a componente é sustentado pelo armazenamento de metadado com o código para a classe. O metadado descreve a classe, incluindo seus métodos e propriedades, bem como sua necessidade de segurança e outros atributos, assim como será que pode ser serializado; o código contém a lógica suficiente para executar suas funções. 4 l Capítulo 1: C# 3.0 e o.net 3.5
Dessa forma, uma classe compilada é uma unidade independente. Então um ambiente de armazenamento de dados que sabe como ler um metadado e um código de uma classe, não precisa de nenhuma outra informação para fazer utilização disso. Isso é possível, usando o C# e o Commom Language Runtime (CLR, Tempo de Execução de Linguagem Comum) para adicionar um metadado personalizado a uma classe pela criação de atributos personalizados. Dessa mesma forma, é possível ler um metadado de classe utilizando os tipos do CLR que suportam reflexão. Quando você compila seu código, cria um assembly. Um assembly é uma coleção de arquivos que aparecem ao programador como uma única DLL, biblioteca de link dinâmico (Dynamic Link Library) ou executável (EXE). Em.NET, um assembly é a unidade básica de reutilização, versionamento, segurança e implantação. O CLR proporciona um número de classes para manipulação de assemblies. Uma nota final sobre o C# é que ele também proporciona suporte para: Acesso direto à Memória utilizando ponteiros do estilo C ++, Palavras-chave para incluir operações como inseguras Avisa o coletor de lixo CLR para não coletar objetos referenciados por ponteiros até que eles sejam liberados Aqui é o mundo em ponteiros: você pode usá-los, mas não pode. Eles são como granadas manuais. Você saberá quando precisará deles, até que você precise, mantenha o pino neles, mas coloque os em sua maleta pessoal, tentando não pensar neles. Se você se deparar consigo mesmo tirando um, chame um amigo antes de puxar pino; então corra para cobrir. A Plataforma.NET Quando a Microsoft anunciou o C# em Julho de 2000, seu lançamento foi parte de um evento muito maior: o pronunciamento da plataforma.net. A plataforma.net foi, em meu ponto de vista, um sistema operacional orientado a objeto disfarçado, colocado no topo do sistema operacional existente..net 3.5 representa um amadurecimento mais além daquele framework e traz consigo uma nova forma de criar, bem, apenas sobre tudo, enquanto faz com que nada que tenha aprendido seja obsoleto. Você ainda pode criar aplicativos web de server-only, mas com AJAX, você pode adicionar controles para a interface cliente (e AJAX proporciona suporte para muito mais, incluindo codificação e decodificação JSON automática). Você pode ainda criar aplicativos de Forms do Windows para aplicativos Windows, mas você também pode criar aplicações Windows mais ricas utilizando WPF, que utiliza uma sintaxe declarativa chamada XAML (explicado com mais detalhe no Capítulo 18). Aquele mesmo XAML é utilizado na criação de aplicativos WF, o qual pode ser utilizado, entre outras coisas, como uma camada de negócios para seus aplicativos. Para uma total exploração do novo.net Framework, por favor ver Programando.NET 3.5 por Jesse Liberty and Alex Horowitz (O Reilly). Numa das mais interessantes adições ao Framework, você pode agora utilizar aquele mesmo XAML para produzir Aplicativos Ricos de Internet multi-plataforma (Windows, Mac e Unix) e multi-navegador (Firefox e Safari) utilizando o Silverlight da Microsoft. Para uma total exploração do Silverlight, por favor ver meu blog em http://silverlight.net/blogs/jesseliberty, fique a espera pelo meu Livro Programando em Silverlight (O Reilly), durante 2008. Todas essas tecnologias de desenvolvimento podem utilizar o C# para lógica de programação; C# pode ser o centro para toda programação que você faz através do quadro no desenvolvimento de aplicativos.net da web para área de trabalho, de clientes pequenos a grandes, de Aplicativos Ricos de Internet a web service. A Linguagem C# l 5