Materiais de Aula

Programação Aplicada em .NET • Prof. Me. William Tenório

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:

  1. Abra o Visual Studio Code.
  2. 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).
  3. No VS Code, vá em File > Open Folder e selecione a pasta criada.
  4. Abra o terminal integrado em Terminal > New Terminal.
  5. 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.

  1. Crie uma classe Pessoa com os atributos Nome (string) e Idade (int), um construtor e um método Apresentar() que exiba "Olá, meu nome é ... e tenho ... anos.". Instancie um objeto e chame o método.
  2. Aplique encapsulamento na classe Pessoa: torne os atributos privados e exponha-os por meio de propriedades (get/set).
  3. Declare variáveis dos tipos int, double, string, bool e char, e tente atribuir a cada uma um valor de tipo incompatível, observando o erro do compilador (tipagem estática).
  4. Crie uma classe ContaBancaria com o atributo privado saldo (decimal) e os métodos Depositar(decimal valor) e Sacar(decimal valor), validando que o valor é positivo e que há saldo suficiente para o saque.
  5. Declare string? nome = null; e escreva um trecho de código que verifica se nome é null antes de usá-lo, evitando um NullReferenceException.
  6. Escreva um método que recebe um parâmetro Pessoa? (anulável) e retorna o nome da pessoa, ou "Desconhecido" caso o parâmetro seja null, usando os operadores ?. e ??.
  7. 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 objeto Pessoa e adicione-o à lista. Por fim, percorra a lista chamando Apresentar() para cada pessoa cadastrada.
  8. Crie uma classe abstrata FormaGeometrica com o método abstrato CalcularArea(). Implemente as classes Quadrado e Circulo, herdando de FormaGeometrica e implementando o cálculo da área.
  9. Crie uma classe Animal com um método virtual EmitirSom() que exiba "Som genérico". Crie as subclasses Cachorro e Gato sobrescrevendo esse método (herança).
  10. Usando as classes do exercício anterior, crie uma lista de Animal contendo objetos Cachorro e Gato, e percorra a lista chamando EmitirSom() 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