String
Adam Boduch
string - słowo kluczowe języka C#
Słowo kluczowe string
jest typem danych służącym do przechowywania ciągów tekstu (inaczej zwanych łańcuchami). Łańcuchy składają się z zestawu znaków typu Char. Długość tekstu jaką możemy przypisać do zmiennej typu string jest teoretycznie nieograniczona (zależy od konfiguracji sprzętowej), a przypisywaną wartość należy ująć w znaki cudzysłowia:
string s1 = "Hello World";
Typ string jest aliasem do klasy System.String
, tak więc nie ma znaczenia czy deklarujemy zmienną typu string
, czy System.String
.
Do poszczególnych znaków łańcucha można odwoływać się przy pomocy symboli [ oraz ] podając numer znaku (indeksu), które są numerowane od zera. Czyli pierwszy znak w ciągu ma indeks 0, kolejny - 1 itd. Np.:
string s1 = "Hello World";
Console.Write(s1[0]); // wyświetli: 'H'
Należy mieć na uwadze fakt, iż typ System.String
jest niezmienny. Oznacza to, że dane do łańcucha mogą być przypisane tylko raz (jeżeli raz stworzyliśmy egzemplarz typu string, to nie będziemy mogli zmienić jego wartości). Nie oznacza to jednak, że poniższy kod spowoduje błąd:
System.String S = "Hello World";
S = "Witaj Świecie";
Jest on jak najbardziej prawidłowy. Jednak realizacja takiego kodu wymaga zastosowania dwóch egzemplarzy (obiektów) w pamięci komputera. Co prawda kod wygląda tak jakbyśmy tę wartość modyfikowali, ale w rzeczywistości w pamięci tworzony jest nowy obiekt z nową wartością, która jest zwracana. Stara wartość znajduje się w pamięci i czeka na usunięcie przez mechanizm platformy .NET ? garbage collection.
Oto prosty fragment kodu:
System.String S = "Hello World";
Console.WriteLine(S.ToUpper());
Console.WriteLine(S);
Metoda ToUpper()
powoduje zamianę wszystkich znaków w łańcuchu na wielkie i zwrócenie tej wartości. Pod zmienną S kryje się jednak oryginalna, pierwotnie zadeklarowana wartość. Aby zastąpić dotychczasową wartość należy użyć oczywiście operatora przypisania:
S = S.ToUpper();
Ze względu na to, iż łańcuchy są niezmienne nie zaleca się przeprowadzania na nich wielu operacji dodawania tekstu, zamiany czy usuwania fragmentów łańcucha. Taki kod będzie po prostu działał niezwykle wolno. Zamiast tego zaleca się użycie klasy StringBuilder
.
Klasa System.String
jest zaplombowana. Oznacza to, że żadna klasa nie może po niej dziedziczyć.
Przeanalizujmy teraz taką sytuację:
System.String S = "Adam";
S = S.Insert(4, " Boduch").ToUpper().Replace("CH", "SZEK");
Mimo iż ten kod może wydawać się nieco dziwny jest jak najbardziej prawidłowy. W pierwszej kolejności pod indeksem nr 4. wstawiany jest nowy tekst. To owocuje powstaniem nowego, zamienionego obiektu, w pamięci. Następnie wszystkie znaki w takim łańcuchu są zamieniane na wielkie, co znowu tworzy nowy obiekt. Na końcu następuje zamiana znaków i utworzenie nowego obiektu, który zostaje przypisany do zmiennej S. Pozostałe obiekty będą dostępne w pamięci do czasu ich usunięcie przez odśmiecacz pamięci (ang. garbage collection).
Aby bardziej zobrazować całą sytuację, proponuje wkleić do swojego projektu następujący kod:
System.String S = "Adam";
Console.WriteLine(S.Insert(4, " Boduch"));
Console.WriteLine(S.ToUpper());
Console.WriteLine(S.Replace("CH", "SZEK"));
// wartość oryginalna
Console.WriteLine(S);
Wszystkie operacje zawarte w tym kodzie będą przeprowadzane na łańcuchu oryginalnym znajdującym się w zmiennej S.
Zobacz też: