C#与.NET 3.0 高级程序设计(英文版)
Parte 1 nnn Apresentando C# e a plataforma .NET
nCAPÍTULO 1 A Filosofia do .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Compreendendo a situação anterior. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
A solução .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Apresentando os blocos de construção da plataforma .NET (CLR, CTS,
e CLS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Linguagens de programação adicionais compatíveis com .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Uma visão geral dos assemblies .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Compreendendo o sistema de tipos comuns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Noções básicas sobre a especificação de linguagem comum. . . . . . . . . . . . . . . . . . . . . . 20
Noções básicas sobre o Common Language Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . 22
A distinção Assembly/Namespace/Tipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Explorando um assembly usando ildasm.exe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Explorando uma montagem usando o refletor de Lutz Roeder. . . . . . . . . . . . . . . . . . . . . . 31
Implantando o tempo de execução do .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
A natureza independente de plataforma do .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
nCAPÍTULO 2 Construindo Aplicativos C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
A função do SDK do .NET Framework 3.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Construindo aplicativos C# usando csc.exe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Construindo aplicativos .NET usando TextPad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Construindo aplicativos .NET usando o Notepad++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Construindo aplicativos .NET usando SharpDevelop. . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Construindo aplicativos .NET usando Visual C# 2008 Express. . . . . . . . . . . . . . . . . . 50
Construindo aplicativos .NET usando o Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . 52
Um catálogo parcial de ferramentas adicionais de desenvolvimento .NET. . . . . . . . . . . . . . . . . . . . 64
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4
Parte 2 nnn Construções básicas de programação em C#
nCAPÍTULO 3 Construções Básicas de Programação em C#, Parte I . . . . . . . . . . . . . . . . . . . . . . . . . 69
A anatomia de um programa C# simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Um aparte interessante: alguns membros adicionais do
Classe System.Environment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
A classe System.Console. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Tipos de dados do sistema e notação abreviada C#. . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Compreendendo o tipo System.String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Restringindo e ampliando as conversões de tipo de dados. . . . . . . . . . . . . . . . . . . . . . . . . . 95
Construções de iteração C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Construtos de Decisão e Operadores Relacionais/Igualdade. . . . . . . . . . . . . . . . . 102
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
nCAPÍTULO 4 Construções Básicas de Programação em C#, Parte II . . . . . . . . . . . . . . . . . . . . . . . . 107
Métodos e modificadores de parâmetros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Noções básicas sobre sobrecarga de membros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Manipulação de array em C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Compreendendo o tipo de enumeração. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Compreendendo o tipo de estrutura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Noções básicas sobre tipos de valor e tipos de referência. . . . . . . . . . . . . . . . . . . . . . . . 129
Tipos de valor e referência: detalhes finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Noções básicas sobre tipos anuláveis em C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
nCAPÍTULO 5 Definindo tipos de classes encapsuladas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Apresentando o tipo de classe C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Noções básicas sobre construtores de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
O papel desta palavra-chave. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Compreendendo a palavra-chave estática. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Definindo os Pilares da POO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Modificadores de acesso C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
O primeiro pilar: serviços de encapsulamento do C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Compreendendo dados constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Noções básicas sobre campos somente leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Noções básicas sobre tipos parciais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Documentando código-fonte C# via XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Visualizando os Frutos do Nosso Trabalho. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
nCAPÍTULO 6 Noções básicas sobre herança e polimorfismo . . . . . . . . . . . . . . . . . . 185
A mecânica básica da herança. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Revisando diagramas de classes do Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
O segundo pilar: os detalhes da herança. . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Programação para Contenção/Delegação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
nCONTEÚDO v
vi nCONTEÚDO
O terceiro pilar: suporte polimórfico do C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Noções básicas sobre regras de conversão de classe base/classe derivada . . . . . . . . . . . . . . . . . . . 210
A classe pai mestre: System.Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
nCAPÍTULO 7 Compreendendo o tratamento estruturado de exceções. . . . . . . . . . . . . . . . . . . 219
Ode aos erros, bugs e exceções. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
A função do tratamento de exceções do .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
O exemplo mais simples possível. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Configurando o estado de uma exceção. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Exceções em nível de sistema (System.SystemException) . . . . . . . . . . . . . . . . . . . . . 230
Exceções em nível de aplicativo (System.ApplicationException) . . . . . . . . . . . . . . . 231
Processando múltiplas exceções. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
O último bloco. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Quem está jogando o quê? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
O resultado de exceções não tratadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Depurando exceções não tratadas usando o Visual Studio. . . . . . . . . . . . . . . . . . . . 242
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
nCAPÍTULO 8 Compreendendo a vida útil do objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Classes, objetos e referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Os princípios básicos da vida útil do objeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
O papel das raízes do aplicativo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Compreendendo as gerações de objetos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
O tipo System.GC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Construindo objetos finalizáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Construindo Objetos Descartáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Construindo Tipos Finalizáveis e Descartáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Parte 3 nnn Construções avançadas de programação em C#
nCAPÍTULO 9 Trabalhando com Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Compreendendo os tipos de interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Definição de interfaces personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Implementando uma Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Invocando Membros da Interface no Nível do Objeto . . . . . . . . . . . . . . . . . . . . . . . . . 276
Interfaces como parâmetros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Interfaces como valores de retorno. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Matrizes de tipos de interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Implementando Interfaces Usando Visual Studio 2008 . . . . . . . . . . . . . . . . . . . . . . . 282
Resolvendo conflitos de nomes por meio da implementação de interface explícita. . . . . . . . . . . . . 283
Projetando Hierarquias de Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Construindo tipos enumeráveis (IEnumerable e IEnumerator) . . . . . . . . . . . . . . . 289
Construindo objetos clonáveis (ICloneable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Construindo objetos comparáveis (IComparable). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Noções básicas sobre interfaces de retorno de chamada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
nCAPÍTULO 10 Coleções e Genéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
As interfaces do namespace System.Collections. . . . . . . . . . . . . . . . . . . . . 309
Os tipos de classe de System.Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Namespace System.Collections.Specialized. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
O relacionamento Boxing, Unboxing e System.Object. . . . . . . . . . . . . . . . . . . 316
A questão da segurança de tipos e coleções fortemente tipadas. . . . . . . . . . . . . . . . . . 319
O namespace System.Collections.Generic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Criando métodos genéricos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Criando Estruturas e Classes Genéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Criando uma coleção genérica personalizada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Criando Classes Base Genéricas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Criação de interfaces genéricas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
nCAPÍTULO 11 Delegados, Eventos e Lambdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Noções básicas sobre o tipo de delegado .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Definindo um delegado em C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
As classes base System.MulticastDelegate e System.Delegate. . . . . . . . . 344
O exemplo de delegado mais simples possível. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Retrofit do tipo de carro com delegados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Um exemplo de delegado mais elaborado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Compreendendo a covariância de delegados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Criando Delegados Genéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Noções básicas sobre eventos C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
O delegado EventHandler<T> genérico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Noções básicas sobre métodos anônimos em C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Noções básicas sobre conversões de grupos de métodos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
O operador Lambda do C# 2008. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
nCAPÍTULO 12 Indexadores, operadores e ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Compreendendo os métodos do indexador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Compreendendo a sobrecarga do operador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Compreendendo as conversões de tipo personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Trabalhando com tipos de ponteiro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Diretivas de pré-processador C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
nCAPÍTULO 13 Recursos da linguagem C# 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Noções básicas sobre variáveis locais digitadas implicitamente. . . . . . . . . . . . . . . . . . . . . . . . . . 415
Noções básicas sobre propriedades automáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Noções básicas sobre métodos de extensão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
nCONTEÚDO vii
Noções básicas sobre métodos parciais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Compreendendo a sintaxe do inicializador de objetos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Noções básicas sobre tipos anônimos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
nCAPÍTULO 14 Uma introdução ao LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Compreendendo a função do LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Uma primeira olhada nas expressões de consulta LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
LINQ e coleções genéricas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
LINQ e coleções não genéricas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
A representação interna dos operadores de consulta LINQ. . . . . . . . . . . . . . . . . . . . . 459
Investigando os operadores de consulta C# LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Consultas LINQ: uma ilha para si? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
PARTE 4 nnn Programação com Assemblies .NET
nCAPÍTULO 15 Apresentando Assemblies .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Definindo Namespaces Personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
A função dos assemblies .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Compreendendo o formato de um assembly .NET. . . . . . . . . . . . . . . . . . . . . . . . . . 482
Construindo e consumindo um assembly de arquivo único. . . . . . . . . . . . . . . . . . . . . . . . . 486
Construindo e Consumindo um Assembly Multifile. . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Noções básicas sobre montagens privadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Noções básicas sobre assemblies compartilhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Consumindo um Assembly Compartilhado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Configurando montagens compartilhadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Investigando a composição interna do GAC . . . . . . . . . . . . . . . . . . . . . . . . 516
Noções básicas sobre assemblies de política do editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Compreendendo o elemento <codeBase>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
O namespace System.Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
O arquivo de configuração da máquina. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
nCAPÍTULO 16 Reflexão de tipo, ligação tardia e baseada em atributos
Programação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
A necessidade de metadados de tipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Compreendendo a reflexão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Construindo um visualizador de metadados personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Carregando montagens dinamicamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Refletindo sobre Assembleias Compartilhadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Noções básicas sobre vinculação tardia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
viii nCONTEÚDO
Noções básicas sobre programação atribuída. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Construindo atributos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Atributos em nível de montagem (e em nível de módulo) . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Refletindo sobre atributos usando vinculação antecipada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Refletindo sobre atributos usando ligação tardia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Colocando reflexão, associação tardia e atributos personalizados em perspectiva. . . . . . 553
Construindo um aplicativo extensível. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
nCAPÍTULO 17 Processos, AppDomains e Contextos de Objetos . . . . . . . . . . . . . . . . . . . 561
Revendo processos Win32 tradicionais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Interagindo com processos na plataforma .NET. . . . . . . . . . . . . . . . . . . . . . 563
Noções básicas sobre domínios de aplicativos .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Compreendendo os limites do contexto do objeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Resumindo Processos, AppDomains e Contexto . . . . . . . . . . . . . . . . . . . . . . 581
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
nCAPÍTULO 18 Construindo Aplicações Multithread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
O relacionamento Processo/AppDomain/Contexto/Thread. . . . . . . . . . . . . . . . . . . . 583
Uma breve revisão do delegado .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
A natureza assíncrona dos delegados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Invocando um método de forma assíncrona. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
O namespace System.Threading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
A classe System.Threading.Thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Criando Threads Secundários Programaticamente . . . . . . . . . . . . . . . . . . . . . . . . . . 597
A questão da simultaneidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Programação com retornos de chamada de temporizador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
Compreendendo o ThreadPool do CLR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
A função do componente BackgroundWorker. . . . . . . . . . . . . . . . . . . . . . . . . . 612
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
nCAPÍTULO 19 Compreendendo o CIL e a função dos assemblies dinâmicos . . . . . . . . 617
Refletindo sobre a natureza da programação CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Examinando diretivas, atributos e códigos de operação CIL . . . . . . . . . . . . . . . . . . . . . . . 618
Pushing e Popping: A natureza baseada em pilha do CIL. . . . . . . . . . . . . . . . . . . . 620
Compreendendo a engenharia de ida e volta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Noções básicas sobre diretivas e atributos CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Biblioteca de classes base .NET, mapeamentos de tipos de dados C# e CIL . . . . . . . . . . . . . . . . 635
Definindo Membros de Tipo em CIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Examinando Opcodes CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Construindo um assembly .NET com CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Noções básicas sobre montagens dinâmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
nCONTEÚDO ix
Parte 5 nnn Apresentando as bibliotecas de classes base .NET
nCAPÍTULO 20 E/S de arquivos e armazenamento isolado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Explorando o namespace System.IO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Os tipos Diretório(Info) e Arquivo(Info). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Trabalhando com o tipo DirectoryInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Trabalhando com o tipo de diretório. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Trabalhando com o tipo de classe DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
Trabalhando com a classe FileInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
Trabalhando com o tipo de arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
A classe de fluxo abstrato. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Trabalhando com StreamWriters e StreamReaders. . . . . . . . . . . . . . . . . . . . . . . . 677
Trabalhando com StringWriters e StringReaders. . . . . . . . . . . . . . . . . . . . . . . . . . 680
Trabalhando com BinaryWriters e BinaryReaders. . . . . . . . . . . . . . . . . . . . . . . . . . 682
“Assistindo” Arquivos Programaticamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Executando E/S de arquivo assíncrono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
Compreendendo a função do armazenamento isolado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Uma cartilha sobre segurança de acesso ao código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
Uma visão geral do armazenamento isolado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Obtendo uma loja usando IsolatedStorageFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
Armazenamento isolado em ação: implantação ClickOnce. . . . . . . . . . . . . . . . . . . . . . . . 707
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
nCAPÍTULO 21 Apresentando a serialização de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Compreendendo a serialização de objetos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Configurando objetos para serialização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Escolhendo um formatador de serialização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Serializando objetos usando BinaryFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
Serializando objetos usando o SoapFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Serializando objetos usando o XmlSerializer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Serializando coleções de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
Personalizando o processo de serialização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
nCAPÍTULO 22 ADO.NET Parte I: A Camada Conectada. . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Uma definição de alto nível de ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Noções básicas sobre provedores de dados ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Namespaces adicionais do ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
Os tipos de namespace System.Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Abstraindo provedores de dados usando interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Criando o banco de dados AutoLot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
O modelo de fábrica do provedor de dados ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Compreendendo a camada conectada do ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . 755
Trabalhando com Leitores de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Construindo uma biblioteca de acesso a dados reutilizável. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
x nCONTEÚDO
Criando um front-end baseado na interface do console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Acesso assíncrono a dados usando SqlCommand. . . . . . . . . . . . . . . . . . . . . . . . . 775
Noções básicas sobre transações de banco de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
nCAPÍTULO 23 ADO.NET Parte II: A camada desconectada . . . . . . . . . . . . . . . . . . . . . . . . 783
Compreendendo a camada desconectada do ADO.NET. . . . . . . . . . . . . . . . . . . . . . 783
Compreendendo a função do DataSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Trabalhando com DataColumns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
Trabalhando com DataRows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789
Trabalhando com DataTables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Vinculando objetos DataTable a interfaces de usuário. . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Preenchendo objetos DataSet/DataTable usando adaptadores de dados . . . . . . . . . . . . . . . . . . . 808
Revisitando AutoLotDAL.dll. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Navegando em objetos DataSet com múltiplas tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
As ferramentas de acesso a dados do Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Desacoplando código gerado automaticamente da camada UI. . . . . . . . . . . . . . . . . . . . . . . 831
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
nCAPÍTULO 24 Programando com APIs LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
O papel do LINQ para ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
Programando com LINQ to DataSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Programando com LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Gerando classes de entidade usando SqlMetal.exe. . . . . . . . . . . . . . . . . . . . . . . . . . . 848
Construindo classes de entidade usando o Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . . . . 854
Manipulando documentos XML usando LINQ to XML. . . . . . . . . . . . . . . . . . . . . . . . 857
Navegando em um documento na memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
nCAPÍTULO 25 Apresentando o Windows Communication Foundation. . . . . . . . . . . . . . . 867
Uma mistura de APIs de computação distribuída. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867
O papel do WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873
Investigando os principais assemblies do WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Os modelos de projeto WCF do Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877
A composição básica de um aplicativo WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
O ABC do WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Construindo um serviço WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Hospedando o serviço WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Construindo o aplicativo cliente WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896
Usando o modelo de projeto da biblioteca de serviços WCF. . . . . . . . . . . . . . . . . . . . . . . . . 900
Hospedando o serviço WCF como um serviço do Windows. . . . . . . . . . . . . . . . . . . . . . . . . 903
Invocando um serviço de forma assíncrona. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908
Projetando contratos de dados WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
nCONTEÚDO xi
nCAPÍTULO 26 Apresentando o Windows Workflow Foundation . . . . . . . . . . . . . . . . . . . . . 917
Definindo um Processo de Negócios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
Os blocos de construção do WF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Assemblies, namespaces e projetos do WF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924
Construindo um aplicativo simples habilitado para fluxo de trabalho. . . . . . . . . . . . . . . . . . . . . . . . . 926
Examinando o código de hospedagem do mecanismo WF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Invocando Web Services em Fluxos de Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Construindo uma biblioteca de códigos WF reutilizáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945
Uma breve palavra sobre atividades personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Parte 6 nnn Interfaces de usuário de desktop
nCAPÍTULO 27 Programando com Windows Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Os namespaces dos Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Construindo um aplicativo simples do Windows Forms (sem IDE). . . . . . . . . . . . . . . . . . 956
O modelo de projeto do Visual Studio Windows Forms. . . . . . . . . . . . . . . . . . . . . . 961
A anatomia de uma forma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Respondendo à atividade do mouse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Respondendo à atividade do teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977
Projetando caixas de diálogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978
Renderizando dados gráficos usando GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985
Construindo um aplicativo Windows Forms completo. . . . . . . . . . . . . . . . . . . . . . . . 990
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
nCAPÍTULO 28 Apresentando o Windows Presentation Foundation e o XAML . . . . . . . 999
A motivação por trás do WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Os vários sabores de aplicativos WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Investigando os Assemblies do WPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004
Construindo um aplicativo WPF (sem XAML). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Detalhes adicionais do tipo de aplicativo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Detalhes adicionais do tipo de janela. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Construindo um aplicativo WPF (centrado em XAML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
Transformando marcação em um assembly .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1025
Separação de preocupações usando arquivos Code-Behind. . . . . . . . . . . . . . . . . . . . . . . 1029
A sintaxe do XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Construindo aplicativos WPF usando o Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . 1044
Processando XAML em tempo de execução: SimpleXamlPad.exe . . . . . . . . . . . . . . . . . . . . . . 1048
O papel do Microsoft Expression Blend. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
xii nCONTEÚDO
nCAPÍTULO 29 Programação com controles WPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1055
Uma pesquisa da biblioteca de controle do WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1055
Declarando controles em XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Compreendendo a função das propriedades de dependência. . . . . . . . . . . . . . . . . . . . . . 1060
Noções básicas sobre eventos roteados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1064
Trabalhando com tipos de botão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068
Trabalhando com CheckBoxes e RadioButtons. . . . . . . . . . . . . . . . . . . . . . . . . . . 1072
Trabalhando com os tipos ListBox e ComboBox. . . . . . . . . . . . . . . . . . . . . . . . 1075
Trabalhando com áreas de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1081
Controlando o layout do conteúdo usando painéis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083
Construindo uma moldura de janela usando painéis aninhados. . . . . . . . . . . . . . . . . . . . . . . 1093
Compreendendo os comandos de controle do WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1099
Compreendendo o modelo de vinculação de dados do WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Conversão de dados usando IValueConverter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
Vinculação a objetos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1108
Vinculando elementos de UI a documentos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116
nCAPÍTULO 30 Renderização gráfica 2D WPF, recursos e temas . . . . . . . . . 1117
A filosofia dos serviços de renderização gráfica WPF. . . . . . . . . . . . . . . . . . . . 1117
Explorando os tipos derivados de formas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Trabalhando com pincéis WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Trabalhando com canetas WPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1130
Explorando os tipos derivados de desenhos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1130
O papel das transformações da UI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Noções básicas sobre os serviços de animação do WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136
Noções básicas sobre o sistema de recursos WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1145
Definindo e aplicando estilos para controles WPF. . . . . . . . . . . . . . . . . . . . . . . . . 1147
Alterando a UI de um controle usando modelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Parte 7 nnn Construindo Aplicações Web com ASP.NET
nCAPÍTULO 31 Construindo páginas da Web ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1163
O papel do HTTP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1163
Noções básicas sobre aplicativos da Web e servidores da Web. . . . . . . . . . . . . . . . . . . . . . 1164
O papel do HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1167
A função dos scripts do lado do cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Enviando os dados do formulário (GET e POST). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
Construindo uma página ASP clássica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Problemas com ASP Clássico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Os namespaces do ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1178
O modelo de código de página da Web ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179
Detalhes de uma estrutura de diretório de site ASP.NET. . . . . . . . . . . . . . . . . . . . . . 1190
O ciclo de compilação de páginas ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
nCONTEÚDO xiii
A cadeia de herança do tipo de página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Interagindo com a solicitação HTTP recebida. . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Interagindo com a resposta HTTP de saída. . . . . . . . . . . . . . . . . . . . . . . . . . 1198
O ciclo de vida de uma página da Web ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
A função do arquivo Web.config. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1203
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1206
nCAPÍTULO 32 Controles, temas e páginas mestras da Web do ASP.NET . . . . . . . . . . . . 1207
Compreendendo a natureza dos controles da Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1207
O tipo System.Web.UI.Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1209
O tipo System.Web.UI.WebControls.WebControl. . . . . . . . . . . . . . . . . . . . . . 1213
Principais categorias de controles da Web ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
Construindo um site ASP.NET rico em recursos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
O papel dos controles de validação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1231
Trabalhando com Temas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1237
Posicionando controles usando tabelas HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1243
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
nCAPÍTULO 33 Técnicas de gerenciamento de estado do ASP.NET . . . . . . . . . . . . . . . . . . . . . . . 1245
A questão do Estado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1245
Técnicas de gerenciamento de estado do ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1247
Compreendendo a função do estado de exibição do ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . 1248
A função do arquivo Global.asax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1251
Compreendendo a distinção entre aplicativo/sessão . . . . . . . . . . . . . . . . . . . . . . 1254
Trabalhando com o cache do aplicativo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Mantendo Dados da Sessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1263
Noções básicas sobre cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1267
A função do elemento <sessionState> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
Noções básicas sobre a API de perfil do ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1272
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Parte 8 nnn Apêndices
nAPÊNDICE A Interoperabilidade COM e .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1283
O escopo da interoperabilidade .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1283
Um exemplo simples de interoperabilidade .NET para COM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1284
Investigando um assembly de interoperabilidade .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1287
Noções básicas sobre o wrapper que pode ser chamado em tempo de execução . . . . . . . . . . . . . . . . . . . . . . . . . . 1289
O papel do COM IDL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Usando uma biblioteca de tipos para construir um assembly de interoperabilidade. . . . . . . . . . . . . . . . . . . . . . 1296
Construindo um servidor COM mais elaborado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1299
Examinando o Assembly de Interoperabilidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Compreendendo a interoperabilidade COM para .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
O papel da CCW. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1306
A função da interface de classe .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
xiv nCONTEÚDO
Construindo seus tipos .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1308
Gerando a biblioteca de tipos e registrando os tipos .NET. . . . . . . . . . . . . . 1310
Examinando as informações do tipo exportado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Construindo um cliente de teste do Visual Basic 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1312
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1313
nAPÊNDICE B Desenvolvimento .NET Independente de Plataforma com Mono . . . . . . . . . . . 1315
A natureza independente de plataforma do .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1315
Obtendo e instalando o Mono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
As ferramentas de desenvolvimento Mono. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1321
Construindo aplicativos .NET com Mono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Sugestões para estudos adicionais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1330
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1331
nÍNDICE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1333
Expandir