System.String tem dezenas de métodos. Esta página cobre os que fazem a maior parte do trabalho em código real, com as opções e as armadilhas que importam. Uma regra vale para todos eles: strings são imutáveis, então todo método retorna uma string nova (ou um valor) e deixa a original sem mudança. s.Trim(); sozinho em uma linha não faz nada; escreva s = s.Trim();.
Split
Split quebra uma string em um string[] em cada separador:
Saída:
3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready
Repare em " blue": Split corta exatamente no separador e mantém os espaços. Duas opções cuidam das limpezas comuns:
Saída:
5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3
RemoveEmptyEntries descarta partes de tamanho zero, mas não partes que só têm espaços (" " sobreviveu acima). O .NET 5 adicionou StringSplitOptions.TrimEntries, e as duas podem ser combinadas: tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) dá o resultado limpo em uma chamada. Passar null como separador divide em qualquer espaço em branco, que é a forma usual de dividir um texto em palavras.
Dividir por um único char (Split(',')) não precisa de array. As sobrecargas que recebem um char mais opções, ou uma única string, existem a partir do .NET Core 2.0; as formas com array usadas acima funcionam em qualquer lugar, inclusive no .NET Framework e na Unity.
Replace
Replace substitui todas as ocorrências de um caractere ou de uma substring:
Saída:
5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces
A sobrecarga com um argumento StringComparison está disponível no .NET Core 2.0 em diante. No .NET Framework, a substituição sem diferenciar maiúsculas e minúsculas é feita com Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). Substituir por "" é como você remove caracteres, e encadear várias chamadas a Replace não tem problema para poucas substituições.
Contains, IndexOf, StartsWith e EndsWith
Estes métodos buscam. Contains responde sim ou não; IndexOf e LastIndexOf retornam uma posição, ou -1 quando não há correspondência; StartsWith e EndsWith testam as pontas.
Saída:
True
False
True
True
8
30
28
-1
16
False
True
True
Todos diferenciam maiúsculas de minúsculas por padrão. Contains(string, StringComparison) existe no .NET Core 2.1 em diante; a forma IndexOf(...) >= 0 funciona em todas as versões, e é por isso que você a vê em código mais antigo. IndexOfAny(new[] { ',', ';' }) encontra o primeiro de vários caracteres.
Uma observação sobre cultura: sem um StringComparison, StartsWith, EndsWith, IndexOf(string) e CompareTo usam regras que dependem da cultura, enquanto Contains, Replace e IndexOf(char) comparam de forma ordinal. Passar StringComparison.Ordinal ou OrdinalIgnoreCase explicitamente remove a ambiguidade, e os analisadores de código recomendam isso.
Trim, TrimStart e TrimEnd
Trim remove os espaços em branco (espaços, tabulações, quebras de linha) das duas pontas. TrimStart e TrimEnd removem de uma ponta só. Se receberem caracteres, eles removem esses caracteres no lugar:
Saída:
[ana@example.com]
[ana@example.com \n]
[ x]
SALE
7
path/to/dir
1,234.50
Trim só mexe nas pontas; os espaços no meio da string são mantidos. TrimStart('0') em "000" retorna uma string vazia, então converta strings numéricas com int.Parse em vez de tirar os zeros à mão.
ToUpper e ToLower
Saída:
MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee
ToUpper e ToLower seguem a cultura atual, então em turco "i".ToUpper() é um İ maiúsculo com ponto, não I. Para identificadores, chaves e nomes de arquivo, use ToUpperInvariant e ToLowerInvariant. Para comparar, use um StringComparison em vez de converter maiúsculas e minúsculas (veja strings). Para colocar a inicial de cada palavra em maiúscula, existe CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text), embora ele não mexa em palavras que já estão todas em maiúsculas.
PadLeft e PadRight
O preenchimento adiciona caracteres até a string chegar a uma largura total. É útil para saídas de largura fixa e para completar códigos com zeros:
Saída:
000042
[Tea ]
[ Tea]
Too long already
Espresso.. 2.40
Latte..... 3.60
Mocha..... 3.95
O alinhamento na interpolação ({name,-10}) faz o mesmo trabalho no próprio texto.
Join e Concat
string.Join coloca um separador entre os elementos de qualquer coleção. string.Concat junta sem separador:
Saída:
Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe
Join é a forma certa de montar uma lista com delimitadores: não sobra separador no fim para remover, e ele monta o resultado em uma passada. Ele chama ToString() em cada elemento, então funciona com números e objetos também.
Reverse, Insert e Remove
Não existe um método string.Reverse que retorne uma string. As duas abordagens usuais:
Saída:
desserts
desserts
True
2026/Q3-09
Hello
HelloWorld
word.Reverse() sozinho retorna um IEnumerable<char>, não uma string; imprimi-lo mostra o nome de um tipo. Os dois métodos invertem unidades de código UTF-16, o que quebra caracteres formados por duas unidades (a maioria dos emojis) e letras com acentos combinados.
Referência rápida
| Tarefa | Método |
|---|---|
| Dividir em partes | s.Split(','), s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) |
| Substituir todas | s.Replace("a", "b") |
| Contém | s.Contains("x"), s.Contains("x", StringComparison.OrdinalIgnoreCase) |
| Posição | s.IndexOf("x"), s.LastIndexOf('x') (-1 se não existir) |
| Começa ou termina com | s.StartsWith("x"), s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) |
| Remover espaços das pontas | s.Trim(), s.TrimStart(), s.TrimEnd() |
| Mudar maiúsculas e minúsculas | s.ToUpper(), s.ToLowerInvariant() |
| Preencher até uma largura | s.PadLeft(6, '0'), s.PadRight(10) |
| Juntar uma coleção | string.Join(", ", items) |
| Parte de uma string | s.Substring(start, length) |
| Inserir ou apagar | s.Insert(i, "x"), s.Remove(i, count) |
| Verificar null ou vazia | string.IsNullOrWhiteSpace(s) |
Perguntas frequentes
Como dividir uma string em C#?
text.Split(',') retorna um string[] com as partes entre as vírgulas. Passe vários separadores como array (Split(new[] { ',', ';' })), um separador string com Split(new[] { ", " }, StringSplitOptions.None), e StringSplitOptions.RemoveEmptyEntries para descartar as partes vazias geradas por separadores repetidos. O .NET 5 adicionou StringSplitOptions.TrimEntries para aparar cada parte.
Como verificar se uma string contém outra, ignorando maiúsculas e minúsculas?
No .NET Core 2.1 em diante: text.Contains("error", StringComparison.OrdinalIgnoreCase). No .NET Framework, que não tem essa sobrecarga, use text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. Evite text.ToLower().Contains(...), que aloca uma cópia e pode se comportar mal em algumas culturas.
String.Replace altera a string original em C#?
Não. Strings são imutáveis, então Replace retorna uma string nova com todas as ocorrências substituídas e deixa a original como estava. Escreva s = s.Replace("old", "new");. Ele substitui todas as ocorrências, não só a primeira; para substituir só a primeira, encontre-a com IndexOf e remonte a string, ou chame Replace em uma instância de Regex com contagem 1.
O que o IndexOf retorna se a string não for encontrada?
-1. Qualquer resultado igual ou maior que 0 é a posição, a partir de zero, da primeira correspondência. Sempre verifique se deu -1 antes de usar o resultado como índice, porque Substring(-1) lança exceção e Substring(-1 + 1) retorna a string inteira sem aviso. LastIndexOf funciona do mesmo jeito, buscando a partir do fim.
Como inverter uma string em C#?
Copie-a para um array de char, inverta o array e monte uma string nova: char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. Com LINQ, new string(s.Reverse().ToArray()) faz o mesmo. Os dois invertem unidades UTF-16, então emojis e acentos combinados podem sair embaralhados.