Ce face Replace, Trim și Substring
În .NET, tipul string este imutabil: nicio metodă precum Replace, Trim, Substring, ToUpperInvariant sau PadLeft nu modifică șirul original în memorie, ci construiește și returnează un șir nou cu transformarea aplicată. Dacă nu atribui rezultatul unei variabile, modificarea se pierde.
Pentru extragerea unei porțiuni dintr-un șir, pe lângă metoda clasică Substring(indexStart, lungime), C# 8+ oferă sintaxa modernă de indexare și intervale (Indices and Ranges): text[0..4] extrage caracterele de la indexul 0 până la 4 (exclusiv), text[3..] extrage totul de la indexul 3 până la capăt, iar prefixul ^ numără de la sfârșitul șirului (de exemplu, text[..^4] elimină ultimele 4 caractere).
Parametri, metode și opțiuni
| Parametru / Metodă | Descriere |
|---|---|
text.Trim() / TrimStart() / TrimEnd() |
Elimină spațiile albe (sau caracterele specificate în paranteză) de la ambele capete, doar de la început sau doar de la sfârșit. |
text.Replace(string oldVal, string newVal) |
Înlocuiește toate aparițiile sub-șirului oldVal cu newVal (acceptă și StringComparison în .NET Core 2.1+). |
text.Substring(int startIndex, int length) |
Extrage un sub-șir care începe la poziția startIndex și are length caractere. |
text[start..end] / text[^n..] |
Operatorul de interval (C# 8+): extrage sub-șirul între limitele start (inclusiv) și end (exclusiv); ^n numără de la final. |
text.ToLowerInvariant() / ToUpperInvariant() |
Convertește șirul la litere mici sau mari folosind regulile culturii invariante. |
text.PadLeft(int totalWidth, char paddingChar) |
Completează șirul la stânga cu caracterul specificat până ajunge la lungimea totală totalWidth. |
Exemple
Exemplul 1: Normalizarea unui slug URL cu Trim, ToLowerInvariant și Replace
Înlănțuim metodele pe string pentru a curăța un titlu de articol și a-i adăuga un număr de ordine formatat cu PadLeft.
string titluBrut = " /// Ghid C# și .NET 8 /// ";
string curatat = titluBrut
.Trim()
.Trim('/')
.Trim()
.ToLowerInvariant()
.Replace("c#", "csharp")
.Replace(".net ", "dotnet-")
.Replace(" ", "-");
string codArticol = "42".PadLeft(5, '0');
Console.WriteLine($" Articol #{codArticol}: {curatat}");
Ieșire în consolă
Articol #00042: ghid-csharp-și-dotnet-8
Exemplul 2: Extragerea fragmentelor cu Substring și cu operatorul Range (.. și ^)
Operatorul de interval [start..end] este tradus de compilator în apeluri Substring, dar este mult mai ușor de citit atunci când vrei să elimini un prefix sau un sufix.
string numeFisier = "IMG_20261023_vacanta.jpg";
string prefix = numeFisier[..3]; // primele 3 caractere ("IMG")
string data = numeFisier.Substring(4, 8); // 8 caractere începând de la indexul 4
string faraExtensie = numeFisier[..^4]; // tot șirul fără ultimele 4 caractere (".jpg")
string extensie = numeFisier[^3..]; // ultimele 3 caractere ("jpg")
Console.WriteLine($"Prefix: {prefix} | Data: {data} | Bază: {faraExtensie} | Ext: {extensie}");
Ieșire în consolă
Prefix: IMG | Data: 20261023 | Bază: IMG_20261023_vacanta | Ext: jpg
Greșeli frecvente
- Apelarea
text.Replace("a", "b");ca instrucțiune de sine stătătoare, fărătext = text.Replace("a", "b");— deoarecestringeste imutabil în C#, variabilatextrămâne neschimbată dacă nu reatribui valoarea returnată. - Confuzia între al doilea parametru din
Substring(start, length)(care reprezintă lungimea fragmentului) și al doilea număr dintext[start..end](care reprezintă indexul de final exclusiv). - Depășirea lungimii șirului în
Substringsau în operatorul[..], ceea ce aruncă imediatArgumentOutOfRangeException; verifică întotdeaunatext.Lengthînainte de tăiere.
Funcții și concepte înrudite
String.Split / String.Join: Desparte un șir de caractere într-un tablou de sub-șiruri după delimitatori și recompune o colecție într-un singur șir.Contains, StartsWith și EndsWith: Verifică dacă un șir conține, începe sau se termină cu un anumit sub-șir și găsește poziția acestuia cu IndexOf.StringBuilder: Construiește și modifică eficient șiruri de caractere într-un buffer mutabil, fără a aloca obiecte intermediare în bucle.Array și Span<T>: Lucrează cu blocuri contigue de memorie și felii (slices) de înaltă performanță fără alocări suplimentare pe heap.