NOTAS DO PROFESSOR 📖 C# e a plataforma .NET Importa separar dois conceitos: C# é a linguagem, .NET é a plataforma e o conjunto de bibliotecas onde corre. A grande mudança recente foi tornar-se verdadeiramente multi-plataforma, deixando de estar preso ao Windows. A semelhança com Java facilita a vida a quem já conhece uma das duas. 🗣️ Pontos a desenvolver oralmente • Clarificar a relação linguagem (C#) vs plataforma (.NET). • Realçar que .NET 8 corre em Linux e Mac, não só Windows. • Mapear os domínios de uso: web (ASP.NET), jogos (Unity), desktop.
NOTAS DO PROFESSOR 📖 A CLI dotnet como centro de comando A ferramenta `dotnet` cria, compila, corre e gere pacotes do projeto a partir do terminal. Aprender estes comandos torna os formandos independentes da IDE e prepara-os para ambientes de automação e CI. Convém criar e correr um projeto em conjunto na sala. 🗣️ Pontos a desenvolver oralmente • Demonstrar `dotnet new`, `dotnet run` e `dotnet build`. • Explicar a diferença entre o SDK (desenvolvimento) e o runtime (execução). • Referir que a mesma CLI funciona igual nos três sistemas operativos.
NOTAS DO PROFESSOR 📖 Menos cerimónia para começar Os top-level statements eliminam o boilerplate da classe Program e do método Main, deixando escrever código logo no ficheiro. Convém explicar que esse esqueleto continua a existir — o compilador gera-o por nós. A interpolação com `$"..."` é a forma moderna de compor strings. 🗣️ Pontos a desenvolver oralmente • Mostrar o que o compilador gera por trás dos top-level statements. • Comparar com o Hello World clássico de Java para realçar a simplificação. • Introduzir a interpolação de strings com `$`.
NOTAS DO PROFESSOR 📖 Tipos e a segurança dos nulls C# é estaticamente tipado como Java, mas acrescenta tipos nullable (`int?`, `string?`) que tornam explícito quando um valor pode ser nulo. O `decimal` é importante: usa-se para dinheiro porque evita os erros de arredondamento do `double`. Esta escolha tem impacto real em aplicações financeiras. 🗣️ Pontos a desenvolver oralmente • Justificar `decimal` para valores monetários com um exemplo de erro de `double`. • Explicar o que o `?` acrescenta a um tipo (permite null). • Mostrar o `var` e quando a inferência é apropriada.
NOTAS DO PROFESSOR 📖 Manipular texto com a biblioteca de strings A interpolação `$"..."` deve ser a forma preferida de juntar variáveis a texto pela legibilidade. Os métodos de string devolvem sempre uma nova string (são imutáveis), tal como em Java e Python. Convém mostrar que `Length` é propriedade e os outros são métodos. 🗣️ Pontos a desenvolver oralmente • Comparar interpolação com concatenação por `+`. • Reforçar a imutabilidade: `Replace` não muda a original. • Notar a convenção PascalCase nos métodos da biblioteca .NET.
NOTAS DO PROFESSOR 📖 Switch expression e pattern matching C# moderno transformou o switch numa expressão que devolve valor, mais conciso e seguro. O pattern matching com `is` permite testar o tipo e ao mesmo tempo capturar a variável já convertida, eliminando casts manuais. São funcionalidades que tornam o código mais expressivo. 🗣️ Pontos a desenvolver oralmente • Comparar o switch expression com o if-else equivalente. • Demonstrar o pattern matching `is string s` e o que poupa em código. • Mostrar o uso do descarte `_` como caso por omissão.
NOTAS DO PROFESSOR 📖 Os ciclos clássicos A sintaxe dos ciclos em C# é praticamente idêntica à de Java e C, o que é uma vantagem para quem migra. O `foreach` é o mais legível para percorrer coleções. Convém reforçar a escolha do ciclo certo conforme se precise ou não do índice. 🗣️ Pontos a desenvolver oralmente • Mostrar quando preferir `foreach` ao `for` indexado. • Distinguir `while` de `do-while` (este corre sempre uma vez). • Ligar o `foreach` às coleções e ao LINQ que vêm a seguir.
NOTAS DO PROFESSOR 📖 Classes e propriedades automáticas A grande diferença face a Java são as propriedades: `{ get; set; }` substitui o par getter/setter manual com uma sintaxe muito mais limpa. O construtor inicializa o estado e os métodos definem comportamento. Convém realçar a convenção PascalCase para membros públicos em C#. 🗣️ Pontos a desenvolver oralmente • Contrastar a propriedade auto de C# com os getters/setters de Java. • Explicar o construtor e a criação de instâncias com `new`. • Notar que em C# as propriedades públicas usam PascalCase.
NOTAS DO PROFESSOR 📖 Campos, propriedades e validação Um campo guarda o valor; uma propriedade controla o acesso. A propriedade com lógica no `set` permite validar antes de gravar (rejeitar saldo negativo), enquanto a auto-propriedade gera o campo por nós. As read-only (só `get`) protegem valores que não devem mudar após a criação. 🗣️ Pontos a desenvolver oralmente • Mostrar a propriedade com validação no `set` como exemplo de encapsulamento. • Distinguir campo privado de propriedade pública. • Explicar o uso de propriedades read-only para imutabilidade parcial.
NOTAS DO PROFESSOR 📖 Herança explícita com virtual/override Ao contrário de Java, em C# um método só pode ser sobreposto se for marcado `virtual` na classe-mãe; a subclasse usa `override`. Esta explicitude evita sobreposições acidentais. O `base` chama a versão da mãe e o `: base(...)` no construtor encadeia a inicialização. 🗣️ Pontos a desenvolver oralmente • Explicar porque é preciso `virtual` para permitir `override` (diferença face a Java). • Mostrar o encadeamento de construtores com `: base(...)`. • Demonstrar polimorfismo com uma coleção de objetos de tipos diferentes.
NOTAS DO PROFESSOR 📖 Contratos com a convenção do I As interfaces em C# definem o contrato que as classes implementam, podendo incluir propriedades além de métodos. A convenção de prefixar com `I` (IAnimal) é universal no ecossistema .NET e ajuda a identificar interfaces de imediato no código. Uma classe pode implementar várias. 🗣️ Pontos a desenvolver oralmente • Reforçar a convenção do prefixo `I` e porque é útil. • Mostrar que uma interface pode exigir propriedades, não só métodos. • Ligar interfaces à injeção de dependências usada em ASP.NET.
NOTAS DO PROFESSOR 📖 Records para dados imutáveis O record é um tipo pensado para guardar dados: imutável por omissão, com comparação por valor e ToString automático. Resolve em uma linha o que noutras linguagens exige muito código repetitivo. A expressão `with` cria uma cópia modificada sem alterar o original. 🗣️ Pontos a desenvolver oralmente • Contrastar a igualdade por valor do record com a igualdade por referência das classes. • Mostrar o `with` para criar variantes sem mutação. • Dar exemplos de quando usar record (DTOs, dados de configuração).
NOTAS DO PROFESSOR 📖 As três coleções essenciais List (ordenada, com duplicados), Dictionary (chave→valor) e HashSet (sem duplicados) cobrem a maioria das necessidades. A sintaxe de inicialização com chavetas é prática. A escolha entre elas deve guiar-se pelas mesmas perguntas vistas noutras linguagens: ordem, unicidade, acesso por chave. 🗣️ Pontos a desenvolver oralmente • Mapear cada coleção C# ao seu equivalente em Java/Python. • Mostrar a sintaxe de inicialização com índices no Dictionary. • Reforçar a decisão List vs Dictionary vs HashSet.
NOTAS DO PROFESSOR 📖 Consultar coleções como se fossem bases de dados O LINQ é uma das joias do C#: permite filtrar, transformar e agregar dados com uma sintaxe uniforme, seja sobre listas em memória ou sobre uma base de dados via EF Core. As duas sintaxes (method e query) são equivalentes — convém dominar a method syntax por ser a mais usada. 🗣️ Pontos a desenvolver oralmente • Mostrar a equivalência entre as duas sintaxes com o mesmo exemplo. • Explicar a avaliação preguiçosa: a query só corre quando se enumera. • Antecipar que o mesmo LINQ servirá para consultar o EF Core mais à frente.
NOTAS DO PROFESSOR 📖 Encadear operações para consultas ricas Combinar Where, OrderBy, Take, Select e GroupBy permite expressar consultas complexas de forma legível. O GroupBy resolve em poucas linhas o que seria um ciclo aninhado trabalhoso. Os tipos anónimos (`new { ... }`) são úteis para moldar o resultado à medida. 🗣️ Pontos a desenvolver oralmente • Decompor a pipeline operação a operação, mostrando o resultado intermédio. • Explicar os tipos anónimos e quando são apropriados. • Dar um caso de negócio para o GroupBy (totais por categoria).
NOTAS DO PROFESSOR 📖 Tratamento de erros em C# O modelo try/catch/finally é semelhante ao de Java, mas C# não tem checked exceptions — nenhuma exceção é obrigatória declarar. Isto dá flexibilidade mas exige disciplina para não ignorar falhas. Apanhar a exceção mais específica antes da genérica continua a ser boa prática. 🗣️ Pontos a desenvolver oralmente • Destacar que C# não obriga a declarar exceções, ao contrário de Java. • Explicar a ordem dos catch do específico para o genérico. • Mostrar o papel do `finally` para limpar recursos.
NOTAS DO PROFESSOR 📖 Validar e sinalizar erros de negócio Lançar exceções com `throw` permite interromper logo uma operação inválida. O `nameof(valor)` produz o nome do parâmetro como texto, evitando strings mágicas que ficam desatualizadas. Exceções personalizadas dão semântica de negócio (SaldoInsuficiente) muito mais clara do que erros genéricos. 🗣️ Pontos a desenvolver oralmente • Explicar a vantagem de `nameof` face a escrever o nome à mão. • Justificar a criação de exceções personalizadas. • Mostrar a validação de argumentos no início do método (guard clauses).
NOTAS DO PROFESSOR 📖 I/O simples com a classe File A classe `File` oferece métodos estáticos diretos para ler e escrever sem gerir streams manualmente. Convém o mesmo alerta de sempre: `WriteAllText` substitui todo o conteúdo, enquanto `AppendAllText` acrescenta. Verificar `File.Exists` antes de ler evita exceções. 🗣️ Pontos a desenvolver oralmente • Avisar sobre a substituição de conteúdo com WriteAll vs AppendAll. • Mostrar a verificação de existência antes de operar sobre o ficheiro. • Referir caminhos relativos vs absolutos e onde o ficheiro é criado.
NOTAS DO PROFESSOR 📖 Converter objetos em texto e vice-versa A serialização JSON transforma objetos C# em texto que se pode guardar ou enviar, e a desserialização faz o caminho inverso. O `System.Text.Json` é a solução integrada no .NET, sem precisar de pacotes externos. É a base da comunicação entre aplicações e APIs. 🗣️ Pontos a desenvolver oralmente • Distinguir serializar (objeto→texto) de desserializar (texto→objeto). • Mostrar a opção `WriteIndented` para JSON legível em desenvolvimento. • Ligar JSON à comunicação com APIs web.
NOTAS DO PROFESSOR 📖 O ORM da plataforma .NET O Entity Framework Core é um ORM: deixa trabalhar com objetos C# em vez de escrever SQL à mão, gerando as queries automaticamente. Aqui usa-se SQLite por ser um ficheiro local sem servidor, ideal para aprender. Os pacotes instalam o provedor da base de dados e as ferramentas de migração. 🗣️ Pontos a desenvolver oralmente • Explicar o conceito de ORM e o que ele poupa face ao JDBC manual de Java. • Justificar SQLite como base de dados de aprendizagem (sem servidor). • Referir que o mesmo EF Core suporta SQL Server, PostgreSQL e outros.
NOTAS DO PROFESSOR 📖 Mapear classes a tabelas A abordagem code-first define o modelo de dados em classes C#, e o EF Core encarrega-se de criar as tabelas. O `DbContext` é a sessão com a base de dados, e cada `DbSet` representa uma tabela. A propriedade `Id` torna-se chave primária por convenção. 🗣️ Pontos a desenvolver oralmente • Explicar a abordagem code-first: o modelo gera o esquema, não o contrário. • Identificar o papel do DbContext como ponte com a base de dados. • Notar as convenções (Id como chave primária) que reduzem configuração.
NOTAS DO PROFESSOR 📖 Migrations e o ciclo CRUD As migrations versionam a evolução do esquema da base de dados, permitindo aplicar mudanças de forma controlada. O CRUD (Create, Read, Update, Delete) faz-se com objetos C# e LINQ, e nada é persistido até chamar `SaveChanges`. Reparar que a leitura usa o mesmo LINQ visto antes. 🗣️ Pontos a desenvolver oralmente • Explicar o que é uma migration e porque versionar o esquema. • Sublinhar que `SaveChanges` é o que confirma as alterações na base de dados. • Ligar o `Where` da leitura ao LINQ aprendido no bloco 4.
NOTAS DO PROFESSOR 📖 Não bloquear à espera de I/O O par async/await permite que o programa não fique parado à espera de operações lentas (rede, disco), libertando a thread para outro trabalho. É essencial em aplicações web (que servem muitos pedidos) e desktop (para não congelar a interface). Convém explicar que `await` não cria threads — coordena tarefas. 🗣️ Pontos a desenvolver oralmente • Distinguir assíncrono de paralelo: await não significa correr em paralelo. • Mostrar o problema concreto que resolve: interface congelada ou servidor bloqueado. • Referir a regra de propagar `async` pela cadeia de chamadas.
NOTAS DO PROFESSOR 📖 Consolidar o percurso em C# Este resumo destaca o que distingue C#: propriedades, records, LINQ, EF Core e async/await — funcionalidades modernas que tornam o código conciso e seguro. Vale a pena ligar cada uma aos destinos de carreira: ASP.NET para backend web, Unity para jogos, MAUI para mobile. 🗣️ Pontos a desenvolver oralmente • Pedir aos formandos que comparem C# com Java, identificando as diferenças-chave. • Apontar os caminhos de aprofundamento conforme o interesse de cada um. • Reforçar que LINQ e async/await são competências muito valorizadas no mercado .NET.