Friday, March 29, 2024 09:11

Cuprins >> Șiruri De Caractere Și Procesarea De Text > String-uri

String-uri

Până acum, am folosit de multe ori Console.ReadLine() în programele noastre de Consolă, pentru a obține un text de la utilizator. Ori de câte ori aveam nevoie să folosim acel text (și chiar inspectând semnătura metodei Console.ReadLine()), trebuia să stocăm acel text într-un tip de variabilă de de tip șir de caractere (string). Când am explicat tipul string, am spus că acesta este de fapt o colecție de variabile de tip char, ambalate împreună într-o singură variabilă.

Să vorbim puțin despre char. În cadrul .NET Framework, fiecare caracter are un număr de serie special din tabelul Unicode. Unicode este un standard internațional de codare pentru lucrul cu diferite limbi și scripturi, prin care fiecărei litere, cifre sau simbol i se atribuie o valoare numerică unică, care este identică pe diferite platforme și programe. Cu alte cuvinte, fiecare caracter are un număr unic care este același pe orice platformă (Unix, Windows, Linux, MacOS etc.), astfel încât caracterul să poată fi recunoscut pe oricare dintre ele. Unicode a fost creat la sfârșitul anilor ’80 și începutul anilor ’90, deoarece predecesorul său, ASCII, reușea să identifice doar 128 sau 256 de caractere. Asta însemna că litere precum ü, ç, ô sau chiar caractere de tip semne, precum £, ©, ±, μ, simboluri matematice, litere rusești, chinezești sau grecești, etc., nu erau disponibile sau recunoscute. Prin utilizarea codificării Unicode, computerele au putut recunoaște brusc peste 100.000 de caractere sau simboluri noi!

Acum, că am vorbit despre codificarea caracterelor, să ne amintim cum obișnuiam să declarăm un șir de caractere:

Prin cunoașterea faptului că o variabilă de tip șir de caractere este doar o colecție de variabile char, putem vizualiza grafic variabila string de mai sus ca fiind

Reprezentarea grafică a variabilei de tip string

Am văzut deja această reprezentare în exemplele despre array-uri. Deci, putem vizualiza string ca o serie de caractere, si putem folosi chiar si un array de tip char[] în loc de un string, dar asta ar avea unele dezavantaje, cum ar fi umplerea array-ului doar un singur caracter la un moment dat, imperativitatea cunoașterii lungimii textului la declararea array-ului, sau prelucrarea manuală a textului. Fiți atenți și la valoarea șirului de caractere – ghilimele nu fac parte din text, ci doar înglobează valoarea acestuia.

Spre deosebire de char, care este un tip de valoare, string este un tip de referință. Încă nu am învățat despre Stack și Heap, dar este suficient să știm că tipurile de referință sunt stocate într-o locație de memorie dinamică și le putem accesa doar printr-un tip special de variabilă numit pointer, care face ceea ce sugerează numele său: indică spre o locație de memorie, unde valoarea este efectiv stocată. Acest subiect este destul de avansat și nu trebuie să vă preocupe acum. Este suficient să spun că un string, fiind un tip de referință, nu poate fi modificat direct și este imuabil (immutable) (secvența de caractere stocate nu se schimbă niciodată) – ori de câte ori atribuim o nouă valoare unei variabile de tip string, de fapt creem o nouă variabilă de tip string în memoria gestionată și facem variabila de tip pointer să indice către această nouă locație, în timp ce conținutul vechii variabile este reciclat. Pentru a demonstra că un string este un șir de caractere, dar și un tip de referință, să luăm următorul cod:

La fel ca și în cazul array-urilor, putem accesa caracterele individuale ale șirului utilizând un index de array, și la fel ca în cazul array-urilor, vom obține o excepție dacă încercăm să accesăm un index care nu există. De asemenea, putem vedea că acest tip de array poate fi doar citit – când am încercat să schimbăm valoarea unui anumit element din array, am primit o eroare. Acest lucru s-a întâmplat deoarece, așa cum am spus deja, șirul de caractere nu poate fi modificat direct: când am încercat să schimbăm valoarea caracterului din interiorul șirului, am încercat să modificăm șirul creat inițial când am declarat variabila string; dar, așa cum am explicat mai devreme, acest lucru nu este permis. Motivul pentru care nu primim o eroare pe ultima linie, când schimbăm valoarea variabilei, este acela că pentru a face acest lucru, nu modificăm conținutul variabilei str originale. În schimb, compilatorul va declara o nouă variabilă în memorie, va face variabila pointer să indice către locația acestei noi variabile și va șterge vechea variabilă.

Începând cu următoarea lecție, vom învăța despre procesarea textului, ceea ce înseamnă operații pe care le putem aplica variabilelor noastre de tip string. După cum veți învăța în curând, procesarea textului este o sarcină foarte comună în programare.

Tags: , , , , ,

Leave a Reply



Follow the white rabbit