Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Apresentação: Neste workshop, vamos aprender o essencial da
linguagem de programação C#, explorando como criar um sistema
robusto e eficiente utilizando a IDE Visual Studio Community 2022.
O que é .NET: O .NET é um framework versátil e extenso no qual a
linguagem de programação C# é executada. Ele fornece uma biblioteca
de classes abrangente que facilita o desenvolvimento de uma ampla
gama de aplicativos, incluindo:
Aplicativos de negócios: Esses aplicativos são projetados para
lidar com a captura, análise e processamento de dados, ajudando as
empresas a tomar decisões informadas.
Aplicativos Web dinâmicos: Com o .NET, você pode criar
aplicativos web interativos que podem ser acessados diretamente
de um navegador da web.
Jogos 2D e 3D: O .NET é capaz de suportar o desenvolvimento de
jogos, oferecendo uma variedade de recursos gráficos e de
desempenho.
Aplicativos financeiros e científicos: O .NET é frequentemente
usado para criar aplicativos que exigem cálculos complexos e
precisos, como os encontrados em ambientes financeiros e
científicos.
Aplicativos seguros baseados em nuvem: O .NET oferece
recursos robustos de segurança e escalabilidade, tornando-o ideal
para o desenvolvimento de aplicativos baseados em nuvem.
Aplicativos móveis: Com o .NET, você pode criar aplicativos
móveis eficientes e responsivos que funcionam em uma variedade
de dispositivos.
Instalação do C#: Download .NET 8.0 (Linux, macOS, and Windows) (microsoft.com)
Instalação do Visual Studio Community 2022: Visual Studio 2022 Community
Edition – Baixe a Versão Gratuita Mais Recente (microsoft.com)
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Novo projeto:
Console Application
Tipo de projeto para execução em prompt de comando (DOS)
Console
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Vamos selecionar a pasta onde o projeto será desenvolvido.
Vamos escolher a versão do .NET
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
/Program.cs
É a classe principal de todo projeto executável criado em .NET (Console ou Web).
É responsável por executar o projeto, através de um método (função) chamado
Main.
//namespace -> define a localização da classe dentro do projeto
namespace Projeto01
{
//definição da classe
class Program
{
//método responsavel por executar o projeto
static void Main(string[] args)
{
//comando para impressão no console
Console.WriteLine("Aula 01 – Aprendendo a programar com C#");
}
}
}
Fazendo a compilação do código:
Menu compilação / compilar solução.
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Para executar o projeto (F5)
Tarefa:
Crie um programa em C# que leia os dados de um Cliente informado pelo
usuário (Nome, E-mail e CPF). O sistema deverá gerar um ID único para este
cliente e gravar os seus dados em um arquivo de extensão JSON na máquina do
usuário.
Tipo de dados:
O tipo de dados representa o tipo de informação que uma variável pode
armazenar, estabelecendo seu limite mínimo e máximo de valores suportados
Variável:
Uma variável é um espaço na memória do computador destinado a um dado que
pode ou não ser alterado durante a execução do algoritmo. Para funcionar
corretamente, as variáveis precisam ser definidas por nomes e tipos.
Principais Tipos Dados
Tipo de Dados
Int Números inteiros (0, 1, 2, 3…)
Float Números inteiros e decimais (0, 1.2, 2.1, 3...)
String Letras números e outros símbolos
Char Uma Letra
Boolean Comandos de VERDADEIRO ou FALSO (true e false)
DateTime Datas e Hora
Classe
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
É o principal artefato de POO. É composta basicamente de: atributos (dados) e
métodos (funções). E em um sistema orientado a objetos cada classe deve ser
coesa para resolver um problema específico do sistema.
Neste projeto da aula de hoje, iremos criar uma primeira classe que será
responsável por modelar os dados de um cliente no projeto.
Cliente
Id: Guid
Nome: String
E-mail: String
CPF: String
** Esta classe tem como responsabilidade apenas modelar os dados
(Campos) e relacionamentos de um cliente na aplicação.
Criando a classe no projeto:
Vamos criar uma pasta chamada de Entities
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Adicionando uma nova classe
Vamos nomear a classe como Cliente
Declarando as propriedades da classe (Properties)
São os campos pertencentes à classe e que poderão ser acessados por outras
classes. Estes campos são visíveis para outras classes por conta da sintaxe
chamada set (Entrada de dados) e get (Saída de dados).
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
No Visual Studio, para que possamos declarar as propriedades de uma classe,
podemos usar o SNIPPET (atalho): prop + 2x[tab]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//namespace -> define a localização da classe
namespace Projeto01.Entities
{
//Modificador de visibilidade public, private e internal
public class Cliente
{
public Guid Id { get; set; }
public string Nome { get; set; }
public string Email { get; set; }
public string CPF { get; set; }
}
}
Objeto (variável de instância)
Consiste em uma variável que contém a referência
(espaço de memória) de uma classe.
** Voltando na classe Program.cs
var cliente = new Cliente();
[Objeto] [Criando a instância da variável (inicializando) ]
[Utilizando a classe Cliente]
//importar o conteudo do namespace
using Projeto01.Entities;
//namespace -> define a localização da classe dentro do projeto
namespace Projeto01
{
//definição da classe
class Program
{
//método responsavel por executar o projeto
static void Main(string[] args)
{
//criando uma variavel de instância para a classe Cliente
var cliente = new Cliente();
cliente.Id = Guid.NewGuid();
cliente.Nome = "Luiz Guilherme Bandeira";
cliente.Email = "
[email protected]";
cliente.CPF = "012345678912";
//imprimir os dados do cliente no console (prompt do DOS)
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Console.WriteLine("Dados do Cliente");
Console.WriteLine($"Id.........: {cliente.Id}");
Console.WriteLine($"Nome.......: {cliente.Nome}");
Console.WriteLine($"E-mail.....: {cliente.Email}");
Console.WriteLine($"CPF........: {cliente.CPF}");
//aguarda uma tecla ser apertada
Console.ReadKey();
}
}
}
Executando:
Estrutura de decisão if:
As estruturas de decisão requerem que o programador especifique uma ou mais
condições a serem avaliadas ou testadas pelo programa, juntamente com uma
instrução ou instruções a serem executadas se a condição for determinada como
verdadeira e, opcionalmente, outras instruções a serem executadas se a
condição for determinada como sendo falsa.
if (condição)
{
//código que será executado se a condição for verdadeira
}else
{
//código que será executado se a condição for falsa
}
V -> V = V
V -> F = F
F -> V = F
F -> F = F
Boas práticas e validações:
Classes anêmicas são classes que contém apenas propriedades sem lógica de
negócio. Classes ricas contém não apenas propriedades, mas também
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
comportamentos que são relevantes para manter o código organizado, coeso e
testável.
Vamos refatorar nossa classe de cliente e adicionar uma função de nome
validade que vai ser responsável por validar as propriedades do cliente, vamos
também deixar os sets das propriedades como privadas, evitando passar os
dados diretamente nelas.
namespace Projeto01
{
public class Cliente
{
public Guid Id { get; private set; }
public string Nome { get; private set; }
public string Email { get; private set; }
public string CPF { get; private set; }
public bool Validate(string nome, string email, string cpf)
{
if (string.IsNullOrEmpty(nome) || nome?.Length <= 2)
{
return false;
}
if (string.IsNullOrEmpty(email) || email.Length <= 2)
{
return false;
}
if (string.IsNullOrEmpty(cpf) || cpf.Length <= 13)
{
return false;
}
Id = Guid.NewGuid();
Nome = nome;
Email = email;
return true;
}
}
}
** Voltando na classe Program.cs
Podemos reparar que não é mais possível adicionar as informações diretamente
nas propriedades.
Chamando o método validate para poder setar as informações do cliente.
namespace Projeto01
{
internal class Program
{
static void Main(string[] args)
{
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Console.WriteLine("Bem vindo!");
Cliente cliente = new Cliente();
if (cliente.Validate("Luiz Guilherme Bandeira",
"
[email protected]","01234567890123"))
{
Console.WriteLine($"ID: {cliente.Id}");
Console.WriteLine($"Nome: {cliente.Nome}");
Console.WriteLine($"Email: {cliente.Email}");
Console.WriteLine($"CPF: {cliente.CPF}");
}
else
{
Console.WriteLine($"Não foi possível registrar o cliente ");
}
}
}
}
Registrando o cliente com os dados validos:
Registrando o cliente com dados inválidos:
SRP – Princípio da responsabilidade única.
Define que cada classe, módulo ou componente de um
projeto deve ter uma única responsabilidade.
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
O SRP tem como benefícios:
O projeto passa a ter mais camadas e subdivisões.
Os códigos as classes tornam-se mais coesos.
Facilita reuso e manutenção do código.
Por exemplo, no nosso projeto da aula, precisamos resolver 2 responsabilidades
do sistema:
Leitura dos dados de um cliente, informado pelo usuário.
Gravar os dados de um cliente em arquivo.
Então para cada uma dessas responsabilidades, será criado uma camada no
sistema composta de novas classes.
Claro! Em C#, funções são blocos de código reutilizáveis que executam uma
tarefa específica. Elas ajudam a organizar e manter o código de forma mais
eficiente. Aqui estão alguns conceitos importantes sobre funções em C#:
Cliente ClienteInput
Id: Guid +LerNome(): String
Nome: String +LerEmail(): String
E-mail: String +LerCPF():String
CPF: String
/Inputs/ClienteInput.cs
Classe para captura dos dados do cliente.
//namespace -> define a localização da classe no projeto
namespace Projeto01.Inputs
{
//public -> acesso total para a classe
public class ClienteInput
{
}
}
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Criando método para que possamos ler os dados do cliente informado
pelo Usuário do sistema.
Métodos
Nome dado às funções declaradas dentro de uma classe. Um método pode ser
chamado a partir da variável de instancia de uma classe (desde que tenha
visibilidade definida para isso) para executar uma tarefa específica.
//namespace -> define a localização da classe no projeto
namespace Projeto01.Inputs
{
/// <summary>
/// Classe para leitura dos dados de um cliente atraves do console.
/// </summary>
public class ClienteInput
{
/// <summary>
/// Método para ler o nome do cliente informado
/// </summary>
/// <returns>O valor do nome do cliente digitado pelo usuario no prompt</returns>
public string LerNome()
{
Console.Write("Informe o nome do cliente....: ");
return Console.ReadLine();
}
/// <summary>
/// Método para ler o email do cliente informado
/// </summary>
/// <returns>O valor do email do cliente digitado pelo usuario no prompt</returns>
public string LerEmail()
{
Console.Write("Informe o email do cliente...: ");
return Console.ReadLine();
}
/// <summary>
/// Método para ler o cpf do cliente informado
/// </summary>
/// <returns>O valor do cpf do cliente digitado pelo usuario no prompt</returns>
public string LerCpf()
{
Console.Write ("Informe o cpf do cliente.: ");
return Console.ReadLine();
}
}
}
Voltando na classe Program.cs
Criando uma variável de instancia para a classe ClienteInput.cs
//importar o conteudo do namespace
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
using Projeto01.Entities;
using Projeto01.Inputs;
//namespace -> define a localização da classe dentro do projeto
namespace Projeto01
{
//definição da classe
class Program
{
//método responsavel por executar o projeto
static void Main(string[] args)
{
//criando uma variavel de instância para a classe Cliente
var cliente = new Cliente();
//criando uma variavel de intancia para a classe ClienteInput
var input = new ClienteInput();
Console.WriteLine("\nENTRE COM OS DADOS DO CLIENTE:\n");
string nome = input.LerNome();
string email = input.LerEmail();
string cpf = input.LerCpf();
//chamando a função responsavel por validar e registrar o cliente
if (cliente.Validate(nome, email, cpf))
{
//imprimir os dados do cliente no console (prompt do DOS)
Console.WriteLine($"ID: {cliente.Id}");
Console.WriteLine($"Nome: {cliente.Nome}");
Console.WriteLine($"Email: {cliente.Email}");
Console.WriteLine($"CPF: {cliente.CPF}");
}
else
{
//imprimir mensagem indicando que não foi possível registrar o cliente
Console.WriteLine($"Não foi possível registrar o cliente ");
}
//aguarda uma tecla ser apertada
Console.ReadKey();
}
}
}
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Métodos estáticos (static)
São métodos de uma classe que não precisam de uma variável de instancia para
serem executados. São métodos que podemos executar sem precisar criar
objetos.
Modificando a classe ClienteInput.cs de forma que todos
os seus métodos sejam estáticos.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Projeto01.Inputs
{
/// <summary>
/// Classe para leitura dos dados de um cliente atraves do console.
/// </summary>
public class ClienteInput
{
/// <summary>
/// Método para ler o nome do cliente informado
/// </summary>
/// <returns>O valor do nome do cliente digitado pelo usuario no prompt</returns>
public static string LerNome()
{
Console.Write("Informe o nome do cliente....: ");
return Console.ReadLine();
}
/// <summary>
/// Método para ler o email do cliente informado
/// </summary>
/// <returns>O valor do email do cliente digitado pelo usuario no prompt</returns>
public static string LerEmail()
{
Console.Write("Informe o email do cliente...: ");
return Console.ReadLine();
}
/// <summary>
/// Método para ler o cpf do cliente informado
/// </summary>
/// <returns>O valor do cpf do cliente digitado pelo usuario no prompt</returns>
public static string LerCpf()
{
Console.Write("Informe o cpf do cliente.: ");
return Console.ReadLine();
}
}
}
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Voltando na classe Program.cs
Modificando a chamada dos métodos da classe ClienteInput:
//importar o conteudo do namespace
using Projeto01.Entities;
using Projeto01.Inputs;
//namespace -> define a localização da classe dentro do projeto
namespace Projeto01
{
//definição da classe
class Program
{
//método responsavel por executar o projeto
static void Main(string[] args)
{
//criando uma variavel de instância para a classe Cliente
var cliente = new Cliente();
Console.WriteLine("\nENTRE COM OS DADOS DO CLIENTE:\n");
string nome = ClienteInput.LerNome();
string email = ClienteInput.LerEmail();
string cpf = ClienteInput.LerCpf();
//chamando a função responsavel por validar e registrar o cliente
if (cliente.Validate(nome, email, cpf))
{
//imprimir os dados do cliente no console (prompt do DOS)
Console.WriteLine($"ID: {cliente.Id}");
Console.WriteLine($"Nome: {cliente.Nome}");
Console.WriteLine($"Email: {cliente.Email}");
Console.WriteLine($"CPF: {cliente.CPF}");
}
else
{
//imprimir mensagem indicando que não foi possível registrar o cliente
Console.WriteLine($"Não foi possível registrar o cliente ");
}
//aguarda uma tecla ser apertada
Console.ReadKey();
}
}
}
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Repositório de dados
(Repository Pattern)
Nome dado às classes de um sistema que tem como responsabilidade gravar,
alterar, excluir ou consultar informações de uma entidade em algum meio de
armazenamento físico (arquivos ou banco de dados).
Cliente ClienteInput
Id: Guid +LerNome(): String
Nome: String +LerEmail(): String
E-mail: String +LerCPF():String
CPF: String
ClienteRepository
+ExportarDados(Cliente) : Void
void
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Palavra reservada utilizada para declararmos métodos que não retornam
nenhum valor.
/Repositories/ClienteRepository.cs
Vamos criar uma pasta chamada de repositories e depois criar a classe chamada
de clienterepository para gravação dos dados em arquivo JSON
using Projeto01.Entities;
namespace Projeto01.Repositories
{
/// <summary>
/// Classe utilizada para gravação dos dados do cliente em arquivo
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
/// </summary>
public class ClienteRepository
{
/// <summary>
/// Método para exportar os dados de um cliente para arquivo JSON
/// </summary>
/// <param name="cliente">Objeto da classe de entidade: Cliente</param>
public void ExportarDados(Cliente cliente)
{
}
}
}
**Note que o método está esperando como parâmetro um objeto da classe
Cliente, iremos passar para o método ExportarDados uma variável de instancia
da classe de entidade: Cliente.
using Projeto01.Entities;
using System.Text.Json;
namespace Projeto01.Repositories
{
/// <summary>
/// Classe utilizada para gravação dos dados do cliente em arquivo
/// </summary>
public class ClienteRepository
{
/// <summary>
/// Método para exportar os dados de um cliente para arquivo JSON
/// </summary>
/// <param name="cliente">Objeto da classe de entidade: Cliente</param>
public void ExportarDados(Cliente cliente)
{
var clientes = new List<Cliente>();
clientes.Add(cliente);
//converter / transformar os dados do cliente em JSON este processo é chamado de
'serialização'
string jsonString = JsonSerializer.Serialize(clientes);
//criar um arquivo em modo de gravação
var writer = new StreamWriter($"c:\\temp\\dados.json");
//gravar o conteudo JSON no arquivo
writer.Write(jsonString);
//fechar o arquivo
writer.Close();
}
}
}
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
List<T> : As listas em C# são uma estrutura de dados dinâmica que permite
armazenar e manipular um conjunto de elementos, elas podem ser criadas
usando a classe genérica List, onde T é o tipo de dado que será armazenado na
lista. As listas podem ser inicializadas com um tamanho específico ou podem
crescer dinamicamente à medida que novos elementos são adicionados.
Propriedades
Items – Obtém ou grava o elemento na posição de índice especificada
Count – Retorna o número total de elementos que existem na lista.
Métodos
Add – Adiciona um elemento ao final da lista
AddRange – Adiciona elementos de uma coleção especificada ao final da lista
Clear – Remove todos os elementos de uma lista
Contains – Verifica se um elemento especificado existe ou não em uma lista
Insert – Insere um elemento em uma posição (índice) especificada na lista
Remove – Remove a primeira ocorrência de um elemento especificado
RemoveAt – Remove o elemento em uma posição especificada na lista
Sort – Ordena os elementos da lista
Voltando ao método Main (Classe Program.cs)
//importar o conteudo do namespace
using Projeto01.Entities;
using Projeto01.Inputs;
using Projeto01.Repositories;
//namespace -> define a localização da classe dentro do projeto
namespace Projeto01
{
//definição da classe
class Program
{
//método responsavel por executar o projeto
static void Main(string[] args)
{
//criando uma variavel de instância para a classe Cliente
var cliente = new Cliente();
Console.WriteLine("\nENTRE COM OS DADOS DO CLIENTE:\n");
cliente.Id = Guid.NewGuid();
cliente.Nome = ClienteInput.LerNome();
cliente.Email = ClienteInput.LerEmail();
cliente.CPF = ClienteInput.LerCpf();
//imprimir os dados do cliente no console (prompt do DOS)
Console.WriteLine("\nDados do Cliente\n");
Console.WriteLine($"Id.........: {cliente.Id}");
Console.WriteLine($"Nome.......: {cliente.Nome}");
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Console.WriteLine($"E-mail.....: {cliente.Email}");
Console.WriteLine($"CPF........: {cliente.CPF}");
//gravar os dados do cliente em arquivo..
var repository = new ClienteRepository();
repository.ExportarDados(cliente);
//imprimindo uma mensagem para indicar ao usuário que a gravação ocorreu com
sucesso
Console.WriteLine("\nARQUIVO JSON GERADO COM SUCESSO!");
//aguarda uma tecla ser apertada
Console.ReadKey();
}
}
}
Executando:
Arquivo Gerado:
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
Conteúdo do Arquivo:
[{"Id":"69b3107e-90b7-4152-978c-84eec6d46d7e","Nome":"Luiz Guilherme
Bandeira","Email":"[email protected]","CPF":"01234567890"}]
____________________________________________________________
Melhorando as validações
Vamos agora melhorar as validações da classe cliente, chamada de repositories
e depois criar a classe chamada de clienterepository para gravação dos dados
em arquivo JSON
/Entities/Cliente.cs
Criando um menu
Vamos agora melhorar as validações da classe cliente, chamada de repositories
e depois criar a classe chamada de clienterepository para gravação dos dados
em arquivo JSON
Estruturas de repetições
For – O laço for é uma estrutura de repetição que utilizamos quando sabemos a
quantidade de repetições que um bloco de código deve ser executado.
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
Foreach - O foreach é um recurso do C# que possibilita executar um conjunto de
comandos para cada elemento presente em uma coleção (Array, List, Stack,
Queue e outras).
While - O loop while executa um bloco de código repetidamente enquanto uma
condição especificada for verdadeira. A condição é verificada antes da execução
do bloco de código, o que significa que se a condição for falsa desde o início, o
bloco de código pode nunca ser executado.
int contador = 0;
Workshop em C#
Aprendendo o essencial da linguagem de programação C# 01
while (contador < 5)
{
Console.WriteLine("Contador: " + contador);
contador++;
}
Do while - O loop do-while é semelhante ao while, mas com uma diferença
crucial: ele garante que o bloco de código seja executado pelo menos uma vez,
pois a condição é verificada após a execução do bloco de código.
int contador = 0;
do
{
Console.WriteLine("Contador: " + contador);
contador++;
} while (contador < 5);
Diferenças Principais
while: Verifica a condição antes de executar o bloco de código.
do-while: Executa o bloco de código pelo menos uma vez antes de