
C# para Iniciantes: Fundamentos do .NET que todo dev precisa (strings, datas/horas, números, globalização, igualdade e utilitários)
Palavra-chave foco: fundamentos do .NET para iniciantes (strings, datas, números, globalização, igualdade)
Dominar os fundamentos do .NET é o que separa quem “faz funcionar” de quem entende o runtime e escreve código confiável. Neste guia prático você verá os blocos essenciais: strings/encodings, datas e horas, números, globalização, igualdade/ordenação e utilitários como Console, Environment e Process.
1) Strings & Encodings (UTF-8 por padrão)
- Por que importa: evitar caracteres “quebrados” e bugs de acentuação.
- Práticas:
- Prefira UTF-8 em leitura/escrita de arquivos e HTTP.
- Use interpolação e formatação com cultura quando exibir números/moeda.
var bytes = System.Text.Encoding.UTF8.GetBytes("Olá, .NET!");
var texto = System.Text.Encoding.UTF8.GetString(bytes);
Console.WriteLine(texto);
Dicas: StringComparison.Ordinal para buscas rápidas; InvariantCulture para persistência.
2) Datas e Horas (sem fuso ~ sem dor)
- Por que importa: fuso horário e horário de verão derrubam sistemas.
- Tipos chave:
DateTime(local/UTC/unspecified) — use UTC para armazenamento.DateOnly/TimeOnly— quando só data ou só hora importam.TimeZoneInfo— conversões corretas de fuso.
var agoraUtc = DateTime.UtcNow;
var sp = TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time");
var horaSp = TimeZoneInfo.ConvertTimeFromUtc(agoraUtc, sp);
Console.WriteLine(horaSp);
Dicas: sempre normalize para UTC no banco; converta para local apenas na borda (UI/API).
3) Números e formatação (de int a BigInteger)
- Por que importa: precisão, desempenho e legibilidade.
- Pontos principais:
- Escolha o tipo certo:
int,long,decimal(dinheiro),double/float(científico),BigInteger(valores enormes). - Formatação consciente de cultura:
- Escolha o tipo certo:
decimal preco = 1234.56m;
var br = new System.Globalization.CultureInfo("pt-BR");
Console.WriteLine(preco.ToString("C", br)); // R$ 1.234,56
Dica: para cálculos monetários, use decimal; evite double por erros de ponto flutuante.
4) Globalização & Cultura (i18n de verdade)
- Por que importa: apps que funcionam fora do seu microambiente.
- Boas práticas:
- Nunca formate para persistir (JSON/DB) com cultura local → use InvariantCulture.
- Ao exibir para humanos, use a CultureInfo do usuário.
var inv = System.Globalization.CultureInfo.InvariantCulture;
double x = 3.14159;
var persistir = x.ToString(inv); // "3.14159"
Dica: para comparação/ordenação de strings “por idioma”, use CompareInfo/CompareOptions.
5) Igualdade & Ordenação (contratos claros)
- Por que importa: coleções corretas, buscas rápidas e menos bugs.
- Ferramentas:
- Implemente
IEquatable<T>e sobrescrevaEquals/GetHashCodeem tipos de valor lógico. - Para ordenar,
IComparable<T>ouIComparer<T>.
- Implemente
public readonly record struct ProdutoId(Guid Value) : IEquatable<ProdutoId>
{
public bool Equals(ProdutoId other) => Value.Equals(other.Value);
public override int GetHashCode() => Value.GetHashCode();
}
Dicas: em records, igualdade por valor já vem pronta; em classes tradicionais, é por referência (a menos que você sobrescreva).
6) Utilitários essenciais do runtime
Console: I/O simples, cores, redirecionamento.Environment: variáveis, separadores, caminho,Environment.Version.Process: iniciar/monitorar processos externos com segurança.
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("Hello, .NET!");
Console.ResetColor();
Console.WriteLine(Environment.OSVersion);
Console.WriteLine(Environment.ProcessorCount);
using var proc = new System.Diagnostics.Process
{
StartInfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "dotnet",
Arguments = "--info",
RedirectStandardOutput = true
}
};
proc.Start();
Console.WriteLine(proc.StandardOutput.ReadToEnd());
Dicas: ao chamar processos, redirecione saída e valide entradas para evitar injeção de comandos.
Checklist rápido (copie e cole no seu projeto)
- Persistir datas em UTC; exibir em cultura do usuário.
- Formatar números/moedas com a
CultureInfocorreta. - Usar UTF-8 em arquivos/HTTP e
StringComparison.Ordinalpara comparações internas. - Definir igualdade/ordenação nos seus tipos de domínio.
- Evitar
doublepara finanças; preferirdecimal. - Persistência com InvariantCulture; UI com cultura do usuário.
FAQ (para SEO)
DateOnly/TimeOnly substituem DateTime?
Não. Eles complementam quando você não precisa de fuso/UTC (ex.: aniversário ou horário de abertura).
Por que minha moeda sai com ponto em vez de vírgula?
Você está usando a cultura errada. Para exibir em PT-BR, forneça new CultureInfo("pt-BR") ao formatar.
É obrigatório implementar IEquatable<T>?
Não, mas melhora performance e coerência em coleções e dicionários com tipos de domínio.
Post baseado no Capítulo 6 — “.NET Fundamentals” do livro C# 12 in a Nutshell, de Joseph Albahari (O’Reilly).