Sobre esta página
Esta página reúne o material de apoio da disciplina: slides, exemplos de código e exercícios apresentados durante as aulas.
Criando um Projeto no VS Code
Siga sempre este roteiro para criar um novo projeto de console em .NET:
- Abra o Visual Studio Code.
- Crie uma pasta com o seu nome em um local do computador de que você vá se lembrar depois (ex.: Área de Trabalho ou Documentos).
- No VS Code, vá em File > Open Folder e selecione a pasta criada.
- Abra o terminal integrado em Terminal > New Terminal.
- No terminal, execute os comandos abaixo.
dotnet new console -n Aula1
cd Aula1
dotnet run
dotnet new console -n Aula1 cria um novo projeto de console chamado Aula1; cd Aula1 entra na pasta do projeto; e dotnet run compila e executa o programa.
Revisão: C# como Linguagem Tipada
C# é uma linguagem fortemente tipada: toda variável tem um tipo definido em tempo de compilação, e o compilador não permite atribuir um valor de tipo incompatível sem uma conversão explícita.
int idade = 20;
double altura = 1.75;
string nome = "Maria";
bool ativo = true;
char letra = 'A';
// idade = "vinte"; // erro de compilação: tipos incompatíveis
Nullability (tipos anuláveis): por padrão, um tipo de referência (como string) pode receber null, o que costuma causar erros em tempo de execução (NullReferenceException). O C# usa o ? para marcar explicitamente que uma variável pode ser nula, deixando essa possibilidade clara no código:
string? nomeOpcional = null; // pode ser nulo
string nomeObrigatorio = "Ana"; // não deveria ser nulo
// Verificando antes de usar
if (nomeOpcional != null)
{
Console.WriteLine(nomeOpcional.ToUpper());
}
// Operador de coalescência nula: usa "Desconhecido" se for null
string exibido = nomeOpcional ?? "Desconhecido";
Vocês já viram em POO I os conceitos de classe, objeto, encapsulamento, herança e polimorfismo. Nesta aula relembramos esses conceitos já aplicados em C#, com atenção à tipagem estática e à nullabilidade da linguagem.
Exercícios de Revisão
Exercícios de revisão de POO I (classes, objetos, encapsulamento, herança e polimorfismo) aplicados em C#, incluindo tipagem e nullabilidade.
- Crie uma classe
Pessoacom os atributosNome(string) eIdade(int), um construtor e um métodoApresentar()que exiba "Olá, meu nome é ... e tenho ... anos.". Instancie um objeto e chame o método. - Aplique encapsulamento na classe
Pessoa: torne os atributos privados e exponha-os por meio de propriedades (get/set). - Declare variáveis dos tipos
int,double,string,boolechar, e tente atribuir a cada uma um valor de tipo incompatível, observando o erro do compilador (tipagem estática). - Crie uma classe
ContaBancariacom o atributo privadosaldo(decimal) e os métodosDepositar(decimal valor)eSacar(decimal valor), validando que o valor é positivo e que há saldo suficiente para o saque. - Declare
string? nome = null;e escreva um trecho de código que verifica senomeénullantes de usá-lo, evitando umNullReferenceException. - Escreva um método que recebe um parâmetro
Pessoa?(anulável) e retorna o nome da pessoa, ou "Desconhecido" caso o parâmetro sejanull, usando os operadores?.e??. - Crie uma lista de
Pessoa. Primeiro, pergunte ao usuário quantas pessoas serão cadastradas; em seguida, para cada uma delas, peça o nome, crie um objetoPessoae adicione-o à lista. Por fim, percorra a lista chamandoApresentar()para cada pessoa cadastrada. - Crie uma classe abstrata
FormaGeometricacom o método abstratoCalcularArea(). Implemente as classesQuadradoeCirculo, herdando deFormaGeometricae implementando o cálculo da área. - Crie uma classe
Animalcom um método virtualEmitirSom()que exiba "Som genérico". Crie as subclassesCachorroeGatosobrescrevendo esse método (herança). - Usando as classes do exercício anterior, crie uma lista de
Animalcontendo objetosCachorroeGato, e percorra a lista chamandoEmitirSom()em cada item (polimorfismo).
Resolução dos Exercícios
Uma proposta de resolução para cada um dos exercícios de revisão apresentados acima.
1. Classe Pessoa com construtor e Apresentar()
public class Pessoa
{
public string Nome;
public int Idade;
public Pessoa(string nome, int idade)
{
Nome = nome;
Idade = idade;
}
public void Apresentar()
{
Console.WriteLine($"Olá, meu nome é {Nome} e tenho {Idade} anos.");
}
}
// Uso
Pessoa pessoa = new Pessoa("Maria", 20);
pessoa.Apresentar();
2. Encapsulamento da classe Pessoa
public class Pessoa
{
private string nome;
private int idade;
public string Nome
{
get { return nome; }
set { nome = value; }
}
public int Idade
{
get { return idade; }
set { idade = value; }
}
public Pessoa(string nome, int idade)
{
Nome = nome;
Idade = idade;
}
public void Apresentar()
{
Console.WriteLine($"Olá, meu nome é {Nome} e tenho {Idade} anos.");
}
}
3. Tipagem estática: atribuições incompatíveis
int idade = 20;
double altura = 1.75;
string nome = "Maria";
bool ativo = true;
char letra = 'A';
// Tentativas inválidas (não compilam):
// idade = "vinte"; // erro: não é possível converter 'string' em 'int'
// altura = "1,75"; // erro: não é possível converter 'string' em 'double'
// nome = 10; // erro: não é possível converter 'int' em 'string'
// ativo = "sim"; // erro: não é possível converter 'string' em 'bool'
// letra = "AB"; // erro: não é possível converter 'string' em 'char'
// O compilador C# impede essas atribuições em tempo de compilação,
// pois a linguagem é fortemente tipada.
4. Classe ContaBancaria
public class ContaBancaria
{
private decimal saldo;
public void Depositar(decimal valor)
{
if (valor <= 0)
{
Console.WriteLine("O valor do depósito deve ser positivo.");
return;
}
saldo += valor;
Console.WriteLine($"Depósito de {valor:C} realizado. Saldo atual: {saldo:C}");
}
public void Sacar(decimal valor)
{
if (valor <= 0)
{
Console.WriteLine("O valor do saque deve ser positivo.");
return;
}
if (valor > saldo)
{
Console.WriteLine("Saldo insuficiente para realizar o saque.");
return;
}
saldo -= valor;
Console.WriteLine($"Saque de {valor:C} realizado. Saldo atual: {saldo:C}");
}
}
5. Verificação de null antes do uso
string? nome = null;
if (nome != null)
{
Console.WriteLine(nome.ToUpper());
}
else
{
Console.WriteLine("Nome não informado.");
}
6. Método com parâmetro Pessoa? anulável
public static string ObterNome(Pessoa? pessoa)
{
return pessoa?.Nome ?? "Desconhecido";
}
// Uso
Pessoa maria = new Pessoa("Maria", 20);
Console.WriteLine(ObterNome(maria)); // Maria
Console.WriteLine(ObterNome(null)); // Desconhecido
7. Lista de Pessoa cadastradas pelo usuário
List pessoas = new List();
Console.Write("Quantas pessoas serão cadastradas? ");
int quantidade = int.Parse(Console.ReadLine());
for (int i = 0; i < quantidade; i++)
{
Console.Write($"Nome da pessoa {i + 1}: ");
string nome = Console.ReadLine();
Pessoa pessoa = new Pessoa(nome, 0);
pessoas.Add(pessoa);
}
foreach (Pessoa pessoa in pessoas)
{
pessoa.Apresentar();
}
8. Classe abstrata FormaGeometrica, Quadrado e Circulo
public abstract class FormaGeometrica
{
public abstract double CalcularArea();
}
public class Quadrado : FormaGeometrica
{
public double Lado;
public Quadrado(double lado)
{
Lado = lado;
}
public override double CalcularArea()
{
return Lado * Lado;
}
}
public class Circulo : FormaGeometrica
{
public double Raio;
public Circulo(double raio)
{
Raio = raio;
}
public override double CalcularArea()
{
return Math.PI * Raio * Raio;
}
}
// Uso
FormaGeometrica quadrado = new Quadrado(4);
FormaGeometrica circulo = new Circulo(3);
Console.WriteLine($"Área do quadrado: {quadrado.CalcularArea()}");
Console.WriteLine($"Área do círculo: {circulo.CalcularArea():F2}");
9. Classe Animal com método virtual e subclasses Cachorro e Gato
public class Animal
{
public virtual void EmitirSom()
{
Console.WriteLine("Som genérico");
}
}
public class Cachorro : Animal
{
public override void EmitirSom()
{
Console.WriteLine("Au au!");
}
}
public class Gato : Animal
{
public override void EmitirSom()
{
Console.WriteLine("Miau!");
}
}
10. Polimorfismo com lista de Animal
List animais = new List
{
new Cachorro(),
new Gato(),
new Animal()
};
foreach (Animal animal in animais)
{
animal.EmitirSom();
}
// Saída:
// Au au!
// Miau!
// Som genérico