C Sharp
C Sharp
É uma linguagem de alto nível, compilada e fortemente tipada (eu preciso informar o tipo da
variável).
Foi criada por Anders Hejsberg em meados de 2001. Ele também criou o Delphi e o Typescript
(superset do JavaScript). Antes ele trabalhava na Borland. Nessa época a principal linguagem
da Microsoft era o Visual Basic. Atualmente a principal linguagem da Microsoft é o C#.
Característica do C#
A Microsoft possui outras linguagens além do C#, como o VB.NET, F# e até Cobol.NET. A
Microsoft criou um ecossistema pensando nisso, em podermos utilizar várias linguagens.
Assim ela tem um único gerenciador que é utilizado para várias linguagens. Cada linguagem
tem o seu próprio compilador que faz uma compilação inicial, que não gera o código binário,
ele gera um código intermediário e depois é feita a compilação final que irá gerar um arquivo
binário. A compilação inicial gera um código intermediário (Intermediate language – IL).
O CLR recebe um código (C#) e compila para IL. O resultado da compilação do IL é sempre o
mesmo.
.NET Framework nasceu em 2001. Versões 1.0, 1.1, 2.0, 3.0, 3.5, 4.x (atualmente). Pode ser
instalada side-by-side (uma versão do lado da outra). Só é compatível com o Windows. É
considerado legado (antigo).
.NET Core nasceu em 2015. É uma versão moderno do .NET Framework. Ele veio para suportar
outros sistemas operacionais como Linux e Mac. Suas primeiras versões tinha apenas o básico.
Ele foi totalmente reescrito. Atualmente já tem quase tudo que tinha no .NET Framework. A
versão 3.1 está bem estável. Versões 1.0, 1.1, 2.0, 2.1, 3.0, 3.1. Instalação side-by-side.
.NET Standard. O .NET Framerwork e .NET Core podem coexistir na mesma máquina. Como
garantir que o código que estamos escrevendo será suportado pelos 2 Frameworks? Isso é
feito pelo .NET Standard que garante que tudo que está sendo escrito irá funcionar no .NET
Core e .NET Framework. O .NET Standard não é um framework, é apenas um contrato, uma
definição. Também é chamado de Surface API. O .NET Standard é um conjunto básico de APIs
comuns a todas as implementações do .NET.
Releases
No .NET Framework não havia uma definição de quando seria lançado uma nova
versão.
No .NET Core, as releases são semestrais. São mais frequentes e a mudanças são
menores.
LTS (Long Term Support). Deve-se usar este release pois garante o suporte por mais
tempo. No .NET Core as versões terminadas em 1 serão LTS, por exemplo versão 3.1.
No .NET 5 as versões maiores serão LTS, por exemplo a versão 5.0 será LTS, as versões
5.x não serão LTS.
Versionamento
Versão semântica que é dividida em fases (Alpha, Beta, Release Candidate, Final).
Alpha é muito no início, é um esboço. Beta é uma versão de testes, já está funcionando.
Release Candidate é de fato a candidata para ser a versão final (correção de bugs).
15.8.2
0.0.1
1.0.2-rc1 (release candidate 1)
Major. Pode conter incompatibilidade com versões anteriores. São chamados de Breaking
Changes
Minor. Possui mudanças, mas é totalmente compatível com versões anteriores. Backward
Compatibility
Alpha. Não se tem certeza de como será o produto, e muito pode mudar. (0.0.1-a1)
Beta. Já tem a ideia da estrutura, mas ainda podem ocorrer alterações (0.0.2-b1)
Runtime e SDK
Resumo:
Visual Studio Code é um editor de código como Atom, Sublime, Brackets.
Visual Studio Community (gratuita) que é uma IDE que possui muitos mais recursos que um
editor de código e precisa de um computador com bastante memória.
Pesquisar: Theme
Criando um projeto
.Net é um Framework para criar aplicações (web, API, machine learning). Cada aplicação que
iremos criar precisamos identificar o tipo de projeto que terá um resultado final diferente.
Class Libray
o O resultado final é uma DLL
o Não possui interface
Console Application
o O resultado é uma aplicação que roda no terminal
o Pode receber dados, esperar input do usuário
Projeto Web
Projeto Testes
Isso criar uma estrutura inicial para o programa.
Se você executar o comando dotnet new, ele irá gerar na pasta atual.
D:\projetos\Teste
Verificar no diretório onde você criou a aplicação e verificar se existe um arquivo com a
extensão csproj. Significa que é um projeto C#, o cs significa c sharp.
Se você executar um dotnet restore, ele irá buscar todos os pacotes que a sua aplicação
precisa para ser executada e fazer a instalação. Por isso que na primeira vez que você cria uma
aplicação, o dotnet restore demora um pouco mais. Por exemplo, para escrever em disco
usaremos o System.IO Namespace, para consultar um banco de dados System.Data.SqlClient
Namespace. São pacotes que o dotnet possui.
A primeira coisa que você faz quando pega uma apliacação dotnet é executar um dotnet
restore.
Se você executar o dotnet restore em um diretório que não tenha um arquivo csproj, ocorrerá
um erro.
Outro comando é o dotnet clean que irá limpar todos os arquivos de cache da nossa aplicação.
Uma dica é antes de executar um dotnet build executar um dotnet clean.
E também temos o dotnet run que é para executar a nossa aplicação. Para testar, toda vez que
você cria uma aplicação com dotnet new, já é criada uma aplicação do tipo console de teste
que mostar Hello World!. Basta executar dotnet run.
Variáveis de ambiente.
Estrutura do App
Ir no diretório da aplicação e digitar [code . ] e o VS Code será aberto com essa aplicação. Ou
você pode abrir o VS Code => File => Open Folder.
Os itens necessários para fazer o debug não foram encontrados. Clicar em Yes.
Program.cs
Toda aplicação .net sem ser um class library, procura um arquivo Program.cs para ser
executado (dotnet run). Não alterar o nome program.cs.
Debug (depuração)
[CTRL crase] Abre um terminal
O x esconde o terminal.
Passando o mouse vemos uma bolinha vermelha do lado esquerdo do código. É o break point
(ponto de pausa). Na execução do seu programa quando chegar nesse ponto ele irá parar a
execução para você verificar alguma coisa (valor das variáveis, por exemplo).
CTRL , para ir no settings e ativar o format on save, que salvará o arquivo com endentação.
Criamos um breakpoint.
Para que o breakpoint funcione temos que executar a aplicação em modo Debug.
Ele parou a execução da aplicação no breakpoint.
Lembrar que precisamos ter a pasta .vscode para poder fazer o debug.
Namespaces são separações lógicas dentro da aplicação. A divisão física fica nos arquivos.
Procura o Program.cs, depois a classe Program, e executa o método Main.
Namespaces
Eu posso ter 2 arquivos com o mesmo nome desde que estejam em pastas diferentes e eles
devem ter namespaces diferentes também. O namespace normalmente tem o mesmo nome
da pasta. Se você tem uma pasta chamada teste, você tem um namespace chamado teste.
Se eu criar uma nova pasta e dentro dela um novo arquivo com o mesmo nome de um arquivo
que está em outra pasta, por exemplo, vou criar uma pasta chamada Teste e dentro dela um
arquivo chamado Program.cs (já existente em outra pasta) e tentar criar um namespace com o
mesmo nome (MeuApp) e criar um classe dentro desse namespace com o mesmo nome de
uma já existente, vou receber um erro.
Pasta Teste
Para resolver isso, alterar o nome do namespace colocando o nome da pasta (sugestão). O
nome do namespace ficará MeuApp.Teste.
O ideal é ter um namespace e uma classe por arquivo, mas o mesmo namespace pode existir
em vários arquivos. Tomar cuidado para não tentar criar classe com o mesmo nome.
Toda vez que vamos usar a classe Teste em outro arquivo temos que chamar o namespace.
Para usar a classe Teste no arquivo Program.cs eu coloquei no início do arquivo “using
MeuApp.Teste;”
Using
Para importar um namespace usamos a palavra using. Tudo o que queremos usar no nosso
programa temos que importar (using) sempre no começo do arquivo (recomendado).
Variáveis
Se você utiliza var sempre precisa passar um valor inicial. Var é uma forma de evitar de
descrever o tipo da variável.
Não criar variável com nomes que não dizem nada como x, y, z.
Constantes
Não é possível usar constante (const) com var. Utilizar sempre com maiúsculas (convenção).
Palavras reservadas.
Comentários
CTRL K C comenta a linha
CTRL K U descomenta
Byte
8 bits = 1 byte
Números inteiros
U => unsigned
Números reais
O var foi interpretado como inteiro.
Boolean
Boolean true e false sempre em minúsculas.
O var automaticamente reconhece a variável como boolean.
Char
Armazena somente um (1) caracter no formato Unicode (universal). Usar aspas simples!
Não podemos user aspas duplas! Dá erro! Aspas duplas é para cadeira de caracteres.
Com aspas simples fica correto.
String
Usamos aspas duplas.
No exemplo acima primeiraLetra é uma lista de caracteres com somente um (1) caracter.
O sublinhado em vermelho significa erro, em amarelo significa que a variável foi definida,
porém nunca foi utilizada.
Sempre colocar ponto e virgula no final (;).
Sempre que o valor da variável estiver entre aspas duplas, será string, independentemente de
termos informado um número.
Var
Se a variável definida por var, na primeira vez for reconhecida por um tipo, deverá permanecer
com este tipo, não podemos mudar o tipo depois.
A variável idade já foi reconhecida como inteiro (int), portanto não poderá receber uma string,
pois já foi reconhecida e definida como int anteriormente.
Apenas um exemplo que quando seria melhor usar var em vez de indicar o tipo.
A primeira definição é igual a segunda, onde foi utilizado o var. Não é para entender agora,
isso é somente para mostrar que existe utilidade para utilizarmos o var.
Object
O object não possui intellisense (ajuda do VS Code auxiliando na codificação e verificação de
erros).
No caso do object eu posso definir uma variável sem passar um valor inicial;
O object permite mudar de int para float. Object pode ser qualquer coisa.
Cuidado ao usar o object, pois você não tem controle sobre qual informação ele contém.
Nullable types
Dessa forma recebemos mensagem de erro, pois int é non-nullable. Precisamos colocar ?
depois do tipo.
Agora a atribuição foi aceita.
Para conseguir atribuir um valor nulo, eu tenho que definir a variável usando (?).
Alias
Valores Padrão
Conversão Implícita
Atribui um inteiro a um número real.
Em tempo de compilação o erro não será mostrado, pois não sabemos qual é o valor da
variável (sem tem valores negativos ou não). Podemos ter erro na execução do programa se
for passado um valor negativo para uma variável unsigned.
Parse
Convert
O convert é diferente do parse, pois o parse é uma extensão do tipo. O convert é uma classe.
O convert permite converter vários tipos e não somente o string. É uma vantagem sobre o
parse. O convert pode converter um double, float, boolean ...para tentar converter de um tipo
para outro. Assim como a conversão explícita e o parse, ele vai tentar converter, se ele não
conseguir irá retornar um erro. Esse erro não acontece em tempo de debug, somente será
pego na execução do programa.Fora a conversão implícita, que já vimos antes, todas as outras
conversões trazem um risco para a execução do programa, pois não sabemos se o valor será
convertido ou se receberemos um erro. Tenha muito cuidado na utilização das conversões.
Se eu não definir um valor para uma variável int, ela terá por default um valor igual a zero.
Se eu tentar fazer uma variável do tipo int receber uma variável do tipo real(float), vou receber
um erro.
Dessa forma eu forço a conversão de um número real para um número inteiro. É uma
conversão explícita.
Observe uma lâmpada amarela indicando um warning avisando que na execução poderá
ocorrer algum problema nesta conversão.
Mostrando o número inteiro convertido de um real que antes fora convertido implicitamente
de um inteiro.
Agora mostrando um inteiro que foi convertido de um real (25.8f). Ele simplesmente eliminou
o decimal do número e mostrou 25 (não fez arredondamento).
Agora usando o comando Parse que espera receber uma string. Observe que ocorreu um erro,
pois não foi passado uma string e sim um float.
Também existe uma outra forma de fazer a conversão que é o .ToString.Todo objeto tem um
método chamado .ToString que fará a conversão para uma string.
Convertemos um real para strings e em seguida utilizamos o .Parse para converter para int.
fizemos isso pois o .Parse precisa receber um string.
Ou podemos criar uma variável valorReal com o valor de real já convertido para uma string e
depois usar esta variável valorReal como parâmetro do int.Parse. É a mesma coisa do exemplo
anterior, apenas fizemos em duas partes.
A variável valorReal está com conteúdo 25.8 e o .Parse não conseguiu converter para int. Este
foi o motivo do erro anterior. Então vamos ter que usar a conversão explícita => (int) real.
Para converter para booleano, 0 significa false, qualquer outro valor significa true.
Operações Aritméticas
Operadores de Atribuição
Operadores de comparação.
Utilizando operadores
Operadores Lógicos
Se tiver somente uma linha depois do for não precisa usar chaves ({}).
Laços de repetição While
O incremento está antes do Console.WriteLine.
Laço de repetição DO
A composição do que o método retorna, nome do método e os parâmetros que ele recebe é
chamado de assinatura do método. Podemos ter métodos com o mesmo nome, porém com
assinaturas diferentes (retorno diferente, parâmetros diferentes ...).
Conversão é ter o nome do método sempre começando com a primeira letra da palavra em
maiúscula.
Usar o void pois não retorna nada.
Para chamar o MeuMetodo dentro do main, tenho que acrescentar static que significa que não
precisa ser instanciada.
Se eu informar que o método retorna algo, no caso retorna uma string, ele deve ter um
retorno em todas as situações da sua função. No exemplo acima o VS infoma que há um erro,
pois se o código somente tem um return se a condição if for verdadeira, se ela for falsa não
temos um return. Nem todo o cenário do seu código retorna um valor.
Se eu quiser que um parâmetro seja opcional, eu devo informar um valor inicial para ele.
Os parâmetros opcionais sempre tem que ter um valor especificado e devem ser os ÚLTIMOS
parâmetros a serem informados no método. Posso ter vários parâmetros opcionais, mas eles
devem estar por último.
Notamos que os valores de x e y mudaram (32 e 25), pois são variáveis diferentes, y é uma
cópia de x.
Agora usando arrays. Criamos um array como sendo string de duas posições e depois fizemos
arr2 = arr.
Apesar de alterarmos somente o arr, o arr2 também foi modificado pois ele é apenas uma
referência para o arr, não é uma cópia.
Structs.
Método não retorna nada e não precisa colocar void e tem o mesmo nome do struct. Não
retorna nada. É executado sempre que o struct é criado (new). É o local ideal para você
inicializar algo.
Structs – Prática
Notar que as conversões de nomes são muito importantes. Quando começa com maiúscula,
Price, é uma propriedade. Com p minúsculo (dolar) é um parâmetro. As convenções nos
ajudam a entender/identificar o que se passa no código.
O método construtor é um método que tem o mesmo nome do struct ou classe, só que não
retorna nada. Também não preciso colocar o void na frente do construtor
. Sempre que se cria um método construtor, eu preciso explicitar os parâmetros que ele irá
receber.
Notar que id, name e price na chamada do método construtor Product, estão escritos em
letras minúsculas. As propriedades tem o mesmo nome dos parâmetros (Id e id), mas a gente
sabe que o nome que começa com maiúscula é propriedade e o nome que começa com
minúscula é parâmetro. No caso Id = id, a propriedade Id recebe o parâmetro id.
Para instanciar um struct, utilizamos o var ou o nome do tipo, no caso Product,( Product
mouse = new Product;() ). Sempre temos duas opções: parameterless (não passa nenhum
parâmetro) ou a opção com parâmetros (que criamos no método construtor). Se não
passarmos nenhum parâmetro quando instanciamos o struct, o programa não vai passar
pelo método construtor e os valores Id, Name, Price não receberão nenhum valor. O Id virá
como zero (int), o Price também virá como zero (double) e o Name virá com vazio (string).
namespace MeuApp2
class Program
Console.WriteLine(mouse.Id);
Console.WriteLine("."+mouse.Name+".");
Console.WriteLine(mouse.Price);
struct Product
Id = id;
Name = name;
Price = price;
}
VSCODE => /d/Veigar/Git Testes/demo-repo
dotnet new console => para criar uma aplicação do tipo console
dotnet run => para executar o projeto que está aberto no VSCode
Enums – Enumeradores
Eu não preciso consultar uma tabela para saber que Casado é igual a 2. Usamos enum para
facilitar, pois fica mais fácil trabalhar com números do que com strings (Casado, casado,
CASADO...).
using System;
namespace MeuApp2
{
class Program
{
static void Main(string[] args)
{
Product mouse = new Product(1,"Mac",1000.99, EProductType.Service);
var manutencaoEletrica = new Product(2,"Manutenção Elétrica residencial", 500,
EProductType.Service );
Console.WriteLine(mouse.Id);
Console.WriteLine("."+ mouse.Name+".");
Console.WriteLine(mouse.Price);
Console.WriteLine(mouse.Type);
Console.WriteLine((int) mouse.Type);
}
}
struct Product
{
public Product(int id, string name, double price, EProductType type)
{
Id = id;
Name = name;
Price = price;
Type = type;
}
public int Id;
public string Name;
public double Price;
public EProductType Type;
Em /d/Veigar/Git Testes
Clicar em yes
Tenho que colocar v1 +v2 entre parênteses para o C# entender que é uma operação.
“texto “+ v1 + v2
using System;
namespace Calculator
{
class Program
{
static void Main(string[] args)
{
Soma();
Subtracao();
Divisao();
Multiplicacao();
}
{
Console.Clear();
Console.WriteLine("== Soma ==");
Console.WriteLine("Primeiro Valor:");
float v1 = float.Parse(Console.ReadLine());
Console.WriteLine("Segundo Valor: ");
float v2 = float.Parse(Console.ReadLine());
}
static void Divisao (){
Console.Clear();
Console.WriteLine("== Divisão ==");
Console.WriteLine("Digite o primeiro valor: ");
var v1 = float.Parse(Console.ReadLine());
Console.WriteLine("Digite o segundo valor: ");
var v2 = float.Parse(Console.ReadLine());
var resultado = v1 / v2 ;
Console.WriteLine($"O valor da divisão de {v1} por {v2} é {resultado}");
Console.ReadKey();
}
}
}
Menu da aplicação
/d/Veigar/Git Testes/Calculator
D:\Veigar\Git Testes
Dotnet new console -o Stopwatch
String