C# Fundamentos Básico
Variáveis e tipos
Em C#, toda variável tem um tipo, que define quais valores ela pode armazenar e quais operações são permitidas. Os tipos se dividem em tipos de valor (como int, double, bool, struct) e tipos de referência (como string, arrays, classes). Tipos de valor guardam o dado diretamente na variável (na pilha), enquanto tipos de referência guardam um endereço para o objeto no heap. Isso afeta cópia, comparação e alocação de memória.
A palavra-chave var permite declarar variáveis com inferência de tipo: o compilador descobre o tipo a partir da expressão de inicialização. var não é "sem tipo", é apenas açúcar sintático. Já as conversões podem ser implícitas (quando não há perda de dados) ou explícitas (com cast, quando pode haver perda).
Para valores que não devem mudar, usamos const (constante em tempo de compilação, embutida no código) e readonly (campo que só pode ser atribuído na declaração ou no construtor, mas calculado em tempo de execução). Entender essas diferenças evita bugs e deixa o código mais expressivo.
Pontos-chave
- Tipos de valor (
int,double,bool,struct) copiam o dado; tipos de referência (string, arrays, classes) copiam a referência. varinfere o tipo em tempo de compilação e exige inicialização na mesma linha.- Conversões implícitas são seguras; explícitas (cast) podem perder dados e precisam de atenção.
consté resolvido em tempo de compilação e só aceita tipos primitivos e string;readonlypode ser calculado no construtor.
using System;
class Program
{
// const: valor fixo em tempo de compilação
const double Pi = 3.14159;
// readonly: pode ser atribuído no construtor
readonly int anoAtual;
public Program(int ano)
{
anoAtual = ano; // atribuição permitida apenas aqui
}
static void Main()
{
// var: inferência de tipo
var nome = "Ana"; // string (referência)
var idade = 30; // int (valor)
var altura = 1.65; // double (valor)
Console.WriteLine($"{nome} tem {idade} anos e {altura} m");
// Conversão implícita (int -> double)
double media = idade / 2.0;
Console.WriteLine($"Média: {media}");
// Conversão explícita (double -> int) com cast
int anosAproximados = (int)altura;
Console.WriteLine($"Anos aproximados: {anosAproximados}");
// Tipos de valor vs referência
int a = 10;
int b = a; // cópia do valor
b = 20;
Console.WriteLine($"a={a}, b={b}"); // a=10, b=20
int[] arr1 = { 1, 2, 3 };
int[] arr2 = arr1; // cópia da referência
arr2[0] = 99;
Console.WriteLine($"arr1[0]={arr1[0]}"); // 99
// const e readonly
Console.WriteLine($"Pi={Pi}, anoAtual={new Program(2025).anoAtual}");
}
}