System.String ha decine di metodi. Questa pagina copre quelli che fanno la maggior parte del lavoro nel codice reale, con le opzioni e le trappole che contano. Una regola vale per tutti: le stringhe sono immutabili, quindi ogni metodo restituisce una nuova stringa (o un valore) e lascia l'originale invariato. s.Trim(); da solo su una riga non fa nulla; scrivi s = s.Trim();.
Split
Split spezza una stringa in uno string[] in corrispondenza di ogni separatore:
Output:
3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready
Nota " blue": Split taglia esattamente sul separatore e conserva gli spazi. Due opzioni gestiscono le pulizie più comuni:
Output:
5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3
RemoveEmptyEntries scarta le parti di lunghezza zero ma non quelle fatte solo di spazi (" " è sopravvissuto qui sopra). .NET 5 ha aggiunto StringSplitOptions.TrimEntries, e le due opzioni si possono combinare: tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) dà il risultato pulito con una sola chiamata. Passare null come separatore divide su qualsiasi spazio bianco, ed è il modo abituale per dividere un testo in parole.
Dividere su un singolo char (Split(',')) non richiede un array. Gli overload che accettano un char più le opzioni, o una singola string, esistono da .NET Core 2.0 in poi; le forme con array usate sopra funzionano ovunque, anche su .NET Framework e Unity.
Replace
Replace sostituisce tutte le occorrenze di un carattere o di una sottostringa:
Output:
5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces
L'overload con un argomento StringComparison è disponibile su .NET Core 2.0 e successivi. Su .NET Framework la sostituzione senza distinzione tra maiuscole e minuscole si fa con Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). Sostituire con "" è il modo per rimuovere caratteri, e concatenare diverse chiamate a Replace va benissimo per poche sostituzioni.
Contains, IndexOf, StartsWith ed EndsWith
Questi metodi cercano. Contains risponde sì o no; IndexOf e LastIndexOf restituiscono una posizione, oppure -1 quando non c'è corrispondenza; StartsWith ed EndsWith controllano le estremità.
Output:
True
False
True
True
8
30
28
-1
16
False
True
True
Tutti distinguono maiuscole e minuscole per impostazione predefinita. Contains(string, StringComparison) esiste su .NET Core 2.1 e successivi; la forma IndexOf(...) >= 0 funziona in ogni versione, ed è per questo che la vedi nel codice più vecchio. IndexOfAny(new[] { ',', ';' }) trova il primo tra più caratteri.
Una nota sulla cultura: senza uno StringComparison, StartsWith, EndsWith, IndexOf(string) e CompareTo usano regole dipendenti dalla cultura, mentre Contains, Replace e IndexOf(char) confrontano in modo ordinale. Passare esplicitamente StringComparison.Ordinal o OrdinalIgnoreCase elimina l'ambiguità, ed è quello che raccomandano gli analizzatori di codice.
Trim, TrimStart e TrimEnd
Trim rimuove gli spazi bianchi (spazi, tabulazioni, a capo) da entrambe le estremità. TrimStart e TrimEnd rimuovono da una sola estremità. Se passi dei caratteri, rimuovono quelli:
Output:
[ana@example.com]
[ana@example.com \n]
[ x]
SALE
7
path/to/dir
1,234.50
Trim tocca solo le estremità; gli spazi all'interno della stringa restano. TrimStart('0') su "000" restituisce una stringa vuota, quindi analizza le stringhe numeriche con int.Parse invece di togliere gli zeri a mano.
ToUpper e ToLower
Output:
MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee
ToUpper e ToLower seguono la cultura corrente, quindi in turco "i".ToUpper() è una İ maiuscola con il punto, non I. Per identificatori, chiavi e nomi di file usa ToUpperInvariant e ToLowerInvariant. Per confrontare, usa uno StringComparison invece di convertire le maiuscole (vedi stringhe). Per rendere maiuscola l'iniziale di ogni parola esiste CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text), che però lascia stare le parole già tutte maiuscole.
PadLeft e PadRight
Il padding aggiunge caratteri finché la stringa non raggiunge una larghezza totale. È comodo per l'output a larghezza fissa e per aggiungere zeri iniziali ai codici:
Output:
000042
[Tea ]
[ Tea]
Too long already
Espresso.. 2.40
Latte..... 3.60
Mocha..... 3.95
L'allineamento nell'interpolazione ({name,-10}) fa lo stesso lavoro direttamente nella stringa.
Join e Concat
string.Join mette un separatore tra gli elementi di qualsiasi collezione. string.Concat unisce senza separatore:
Output:
Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe
Join è il modo giusto per costruire un elenco delimitato: non c'è un separatore finale da togliere, e costruisce il risultato in un solo passaggio. Chiama ToString() su ogni elemento, quindi funziona anche con numeri e oggetti.
Reverse, Insert e Remove
Non esiste un metodo string.Reverse che restituisca una stringa. I due approcci abituali:
Output:
desserts
desserts
True
2026/Q3-09
Hello
HelloWorld
word.Reverse() da solo restituisce un IEnumerable<char>, non una stringa; stamparlo mostra il nome di un tipo. Entrambi i metodi invertono le unità di codice UTF-16, il che rompe i caratteri formati da due unità (la maggior parte delle emoji) e le lettere con accenti combinati.
Riferimento rapido
| Operazione | Metodo |
|---|---|
| Dividere in parti | s.Split(','), s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) |
| Sostituire tutto | s.Replace("a", "b") |
| Contiene | s.Contains("x"), s.Contains("x", StringComparison.OrdinalIgnoreCase) |
| Posizione | s.IndexOf("x"), s.LastIndexOf('x') (-1 se assente) |
| Inizia o finisce con | s.StartsWith("x"), s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) |
| Togliere gli spazi alle estremità | s.Trim(), s.TrimStart(), s.TrimEnd() |
| Cambiare maiuscole e minuscole | s.ToUpper(), s.ToLowerInvariant() |
| Riempire fino a una larghezza | s.PadLeft(6, '0'), s.PadRight(10) |
| Unire una collezione | string.Join(", ", items) |
| Parte di una stringa | s.Substring(start, length) |
| Inserire o eliminare | s.Insert(i, "x"), s.Remove(i, count) |
| Controllo null o vuota | string.IsNullOrWhiteSpace(s) |
Domande frequenti
Come divido una stringa in C#?
text.Split(',') restituisce uno string[] con le parti tra le virgole. Passa più separatori come array (Split(new[] { ',', ';' })), un separatore stringa con Split(new[] { ", " }, StringSplitOptions.None), e StringSplitOptions.RemoveEmptyEntries per scartare le parti vuote prodotte da separatori doppi. .NET 5 ha aggiunto StringSplitOptions.TrimEntries per rifilare ogni parte.
Come controllo se una stringa ne contiene un'altra, ignorando maiuscole e minuscole?
Su .NET Core 2.1 e successivi: text.Contains("error", StringComparison.OrdinalIgnoreCase). Su .NET Framework, che non ha quell'overload, usa text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. Evita text.ToLower().Contains(...), che alloca una copia e con alcune culture può comportarsi in modo strano.
String.Replace modifica la stringa originale in C#?
No. Le stringhe sono immutabili, quindi Replace restituisce una nuova stringa con tutte le occorrenze sostituite e lascia l'originale com'era. Scrivi s = s.Replace("old", "new");. Sostituisce tutte le occorrenze, non solo la prima; per sostituire solo la prima, trovala con IndexOf e ricostruisci la stringa, oppure chiama Replace su un'istanza di Regex con un conteggio di 1.
Cosa restituisce IndexOf se la stringa non viene trovata?
-1. Qualsiasi risultato pari a 0 o maggiore è la posizione, a partire da zero, della prima corrispondenza. Controlla sempre il -1 prima di usare il risultato come indice, perché Substring(-1) lancia un'eccezione e Substring(-1 + 1) restituisce silenziosamente l'intera stringa. LastIndexOf funziona allo stesso modo, cercando dalla fine.
Come inverto una stringa in C#?
Copiala in un array di char, inverti l'array e crea una nuova stringa: char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. Con LINQ, new string(s.Reverse().ToArray()) fa lo stesso. Entrambi invertono le unità UTF-16, quindi emoji e accenti combinati possono uscire rovinati.