System.String possède des dizaines de méthodes. Cette page couvre celles qui font l'essentiel du travail dans du vrai code, avec les options et les pièges qui comptent. Une règle s'applique à toutes : les chaînes sont immuables, donc chaque méthode renvoie une nouvelle chaîne (ou une valeur) et laisse l'originale inchangée. s.Trim(); seul sur sa ligne ne fait rien ; écrivez s = s.Trim();.
Split
Split découpe une chaîne en string[] à chaque séparateur :
Sortie :
3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready
Remarquez " blue" : Split coupe exactement au séparateur et conserve les espaces. Deux options gèrent les nettoyages courants :
Sortie :
5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3
RemoveEmptyEntries supprime les parties de longueur nulle, mais pas celles qui ne contiennent que des espaces (" " a survécu ci-dessus). .NET 5 a ajouté StringSplitOptions.TrimEntries, et les deux peuvent se combiner : tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) donne le résultat propre en un seul appel. Passer null comme séparateur découpe sur n'importe quel espace blanc, ce qui est la façon habituelle de découper un texte en mots.
Découper sur un seul char (Split(',')) ne demande pas de tableau. Les surcharges qui prennent un char plus des options, ou une seule string, existent depuis .NET Core 2.0 ; les formes à tableau utilisées ci-dessus fonctionnent partout, y compris .NET Framework et Unity.
Replace
Replace remplace chaque occurrence d'un caractère ou d'une sous-chaîne :
Sortie :
5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces
La surcharge avec un argument StringComparison est disponible sur .NET Core 2.0 et plus. Sur .NET Framework, le remplacement insensible à la casse se fait avec Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). Remplacer par "" est la façon de supprimer des caractères, et enchaîner plusieurs appels à Replace convient pour quelques substitutions.
Contains, IndexOf, StartsWith et EndsWith
Ces méthodes recherchent. Contains répond oui ou non ; IndexOf et LastIndexOf renvoient une position, ou -1 en l'absence de correspondance ; StartsWith et EndsWith testent les extrémités.
Sortie :
True
False
True
True
8
30
28
-1
16
False
True
True
Toutes sont sensibles à la casse par défaut. Contains(string, StringComparison) existe sur .NET Core 2.1 et plus ; la forme IndexOf(...) >= 0 fonctionne sur toutes les versions, c'est pourquoi on la voit dans le code plus ancien. IndexOfAny(new[] { ',', ';' }) trouve le premier de plusieurs caractères.
Une remarque sur la culture : sans StringComparison, StartsWith, EndsWith, IndexOf(string) et CompareTo utilisent des règles sensibles à la culture, alors que Contains, Replace et IndexOf(char) comparent de façon ordinale. Passer explicitement StringComparison.Ordinal ou OrdinalIgnoreCase supprime l'ambiguïté, et les analyseurs de code le recommandent.
Trim, TrimStart et TrimEnd
Trim supprime les espaces blancs (espaces, tabulations, sauts de ligne) aux deux extrémités. TrimStart et TrimEnd les suppriment d'un seul côté. Si on leur donne des caractères, elles suppriment ceux-là à la place :
Sortie :
[ana@example.com]
[ana@example.com \n]
[ x]
SALE
7
path/to/dir
1,234.50
Trim ne touche qu'aux extrémités ; les espaces à l'intérieur de la chaîne sont conservés. TrimStart('0') sur "000" renvoie une chaîne vide, donc analysez les chaînes numériques avec int.Parse plutôt que de retirer les zéros à la main.
ToUpper et ToLower
Sortie :
MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee
ToUpper et ToLower suivent la culture courante, donc en turc "i".ToUpper() donne un İ majuscule pointé, pas I. Pour les identifiants, les clés et les noms de fichiers, utilisez ToUpperInvariant et ToLowerInvariant. Pour comparer, utilisez une StringComparison au lieu de convertir la casse (voir chaînes). Pour mettre une majuscule à chaque mot, il existe CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text), qui laisse toutefois intacts les mots déjà entièrement en majuscules.
PadLeft et PadRight
Le remplissage ajoute des caractères jusqu'à ce que la chaîne atteigne une largeur totale. C'est pratique pour une sortie à largeur fixe et pour compléter des codes avec des zéros :
Sortie :
000042
[Tea ]
[ Tea]
Too long already
Espresso.. 2.40
Latte..... 3.60
Mocha..... 3.95
L'alignement de l'interpolation ({name,-10}) fait le même travail directement dans le texte.
Join et Concat
string.Join place un séparateur entre les éléments de n'importe quelle collection. string.Concat assemble sans séparateur :
Sortie :
Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe
Join est la bonne façon de construire une liste délimitée : il n'y a pas de séparateur final à retirer, et le résultat est construit en un seul passage. La méthode appelle ToString() sur chaque élément, elle fonctionne donc aussi avec des nombres et des objets.
Reverse, Insert et Remove
Il n'existe pas de méthode string.Reverse qui renvoie une chaîne. Les deux approches habituelles :
Sortie :
desserts
desserts
True
2026/Q3-09
Hello
HelloWorld
word.Reverse() seul renvoie un IEnumerable<char>, pas une chaîne ; l'afficher montre un nom de type. Les deux méthodes inversent des unités de code UTF-16, ce qui casse les caractères faits de deux unités (la plupart des emoji) et les lettres avec accents combinants.
Référence rapide
| Tâche | Méthode |
|---|---|
| Découper en parties | s.Split(','), s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) |
| Tout remplacer | s.Replace("a", "b") |
| Contient | s.Contains("x"), s.Contains("x", StringComparison.OrdinalIgnoreCase) |
| Position | s.IndexOf("x"), s.LastIndexOf('x') (-1 si absent) |
| Commence ou finit par | s.StartsWith("x"), s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) |
| Supprimer les espaces aux extrémités | s.Trim(), s.TrimStart(), s.TrimEnd() |
| Changer la casse | s.ToUpper(), s.ToLowerInvariant() |
| Compléter jusqu'à une largeur | s.PadLeft(6, '0'), s.PadRight(10) |
| Assembler une collection | string.Join(", ", items) |
| Partie d'une chaîne | s.Substring(start, length) |
| Insérer ou supprimer | s.Insert(i, "x"), s.Remove(i, count) |
| Test null ou vide | string.IsNullOrWhiteSpace(s) |
Questions fréquentes
Comment découper une chaîne en C# ?
text.Split(',') renvoie un string[] des parties situées entre les virgules. Passez plusieurs séparateurs sous forme de tableau (Split(new[] { ',', ';' })), un séparateur chaîne avec Split(new[] { ", " }, StringSplitOptions.None), et StringSplitOptions.RemoveEmptyEntries pour supprimer les parties vides produites par des séparateurs doublés. .NET 5 a ajouté StringSplitOptions.TrimEntries pour rogner chaque partie.
Comment vérifier qu'une chaîne en contient une autre, sans tenir compte de la casse ?
Sur .NET Core 2.1 et plus : text.Contains("error", StringComparison.OrdinalIgnoreCase). Sur .NET Framework, qui n'a pas cette surcharge, utilisez text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. Évitez text.ToLower().Contains(...), qui alloue une copie et peut mal se comporter dans certaines cultures.
String.Replace modifie-t-il la chaîne d'origine en C# ?
Non. Les chaînes sont immuables, donc Replace renvoie une nouvelle chaîne où chaque occurrence est remplacée et laisse l'originale telle quelle. Écrivez s = s.Replace("old", "new");. La méthode remplace toutes les occurrences, pas seulement la première ; pour ne remplacer que la première, trouvez-la avec IndexOf et reconstruisez la chaîne, ou appelez Replace sur une instance de Regex avec un compte de 1.
Que renvoie IndexOf si la chaîne n'est pas trouvée ?
-1. Tout résultat supérieur ou égal à 0 est la position, à partir de zéro, de la première correspondance. Vérifiez toujours -1 avant d'utiliser le résultat comme index, car Substring(-1) lève une exception et Substring(-1 + 1) renvoie silencieusement toute la chaîne. LastIndexOf fonctionne de la même façon, en cherchant depuis la fin.
Comment inverser une chaîne en C# ?
Copiez-la dans un tableau de char, inversez le tableau et construisez une nouvelle chaîne : char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. Avec LINQ, new string(s.Reverse().ToArray()) fait la même chose. Les deux inversent des unités UTF-16, donc les emoji et les accents combinants peuvent ressortir mélangés.