Kolejna część nauki programowania w języku C# dotyczyć będzie poszerzenia tematu dotyczącego łańcuchów znaków. Konkretniej, to nas będzie interesować formatowanie łańcuchów znaków w języku C#, czyli kilka sposobów wypisywania na strumieniu wyjściowym łańcuchów, również w połączeniu z wartościami zmiennych!
Tweet |
FORMATOWANIE ŁAŃCUCHÓW ZNAKÓW W JĘZYKU C# TO KILKA SPOSOBÓW PREZENTACJI
Jak już wiemy z artykułu o pierwszym programie, "Console.WriteLine" odpowiada za wypisywanie podanego łańcucha na strumień wyjściowy (jeśli mówicie "na ekran", to mówicie błędnie - nie musi to być ekran monitora :)):
Console.WriteLine("Mój łańcuch znaków.");
Jeśli chcemy wpisać sam z góry ustalony tekst, to nie ma problemu. Co jednak w przypadku, gdy w grę mają wchodzić zmienne? Rozpatrzmy na spokojnie wszystkie kombinacje jakich można użyć.
SAMA ZMIENNA
Funkcja "Console.WriteLine" udostępnia przeciążoną wersję pozwalającą na wstawienie samej wartości zmiennej zamiast funkcji (przeciążanie polega na zdefiniowaniu funkcji o tej samej nazwie, różniącej się listą parametrów formalnych oraz która może różnić się zwracanym typem wartości). Pisząc w ten sposób:
Console.WriteLine(9);
ewentualnie:
int x = 9;
Console.WriteLine(x);
po prostu wypisze się na strumieniu liczbę dziewięć i koniec zagadnienia. W przypadku niestandardowego typu danych jakim jest na przykład obiekt, wtedy sprawa wygląda inaczej (więcej szczegółów zostanie przedstawionych w odrębnym artykule). Na tę chwilę wystarczy Wam wiedzieć, że jeżeli zależy Wam tylko na samej wartości podanej zmiennej, możecie bez problemów ją wstawić w miejsce parametru.
POŁĄCZENIA
Drugi sposób połączenia ze sobą różnych składników również został przewidziany. Kombinacji może być kilka. Możemy chcieć połączyć łańcuch znaków ze zmienną, zmienną z inną zmienną lub też łańcuch z innym łańcuchem. Bez względu na pożądany wynik, droga do niego prowadzi przez to samo. Konkatenacja!
KONKATENACJA
Konkatenacja to połączenie (scalenie) kilku różnych wartości bądź wyrażeń w jeden wielki łańcuch znaków. Jest ono realizowane poprzez znak dodawania (plusa) umieszczanego pomiędzy wyrażeniami (ładniej jest powiedzieć że to "operator dwuargumentowy wymagający operandu po obu stronach"). To najbardziej podstawowa metoda umożliwiająca formatowanie łańcuchów znaków w języku C#. Przedstawię Wam teraz trzy kombinacje wartości.
ŁAŃCUCH + ZMIENNA
Oto prosty przykład ukazujący udział konkatenacji łańcuchów z liczbami całkowitymi "int":
int a = 2;
int b = 2;
int result = a + b;
Console.WriteLine(a + " + " + b + " = " + result);
W ramach małego testu na spostrzegawczość, spróbujcie sami zidentyfikować który z plusów jest operatorem konkatenacji, a który tylko łańcuchem :).
Jak widzicie, to jest nic innego jak niewinna zabawa we "wszczepianie" wartości różnych typów pomiędzy łańcuchy (oczywiście nie wszystkie kombinacje są dopuszczalne). Wspomniałem także o wyrażeniach i w rzeczy samej, można wstawić sumę bezpośrednio do funkcji:
int a = 2;
int b = 2;
Console.WriteLine(a + " + " + b + " = " + (a + b));
ŁAŃCUCH + ŁAŃCUCH
Największa użyteczność konkatenacji to sklejanie ze sobą wartości różnych typów, choć nic nie stoi na przeszkodzie, aby zastosować ją dla samych łańcuchów znaków:
Console.WriteLine("Tekst " + "jest " + "połączony.");
Żebyśmy się dobrze rozumieli, to także jest w całości poprawne. Uważajcie tylko na konieczność wstawiania dodatkowych spacji z którejś strony (albo jako ostatni znak tekstu "po lewej", albo jako pierwszy znak tekstu "po prawej"), żeby zapewnić odstępy między słowami!
ZMIENNA + ZMIENNA
Formatowanie łańcuchów znaków w języku C# zezwala na wiele różnorakich kombinacji. Trzecia opcja to chęć połączenia ze sobą wartości. Tu może czekać na Was dezorientacja! Dla przykładu, próba wstawienia "plusa" między liczbami zostanie potraktowana jak zwykłe dodawanie. Wynikiem na wyjściu będzie zatem suma obu podanych liczb:
int a = 5, b = 9;
Console.WriteLine(a + b);
Myślicie, że jak dorzucicie do scalenia dowolny łańcuch znaków, to coś ulegnie zmianie w sumowaniu? Nie!
Console.WriteLine(a + b + "a");
Na wyjściu będzie "14a"! Czyli nadal składniki zostaną zsumowane. Co ciekawe, jeśli dorzucicie tę samą literkę ale już jako znak (apostrofy zamiast cudzysłowów):
Console.WriteLine(a + b + 'a');
sumą będzie 111. Dlaczego? Ponieważ znak 'a' zostanie zamieniony na kod w systemie ASCII! Znak 'a' nosi liczbę 97 w systemie dziesiętnym. Prosta kalkulacja.
Gdybyście chcieli zamienić liczby na łańcuchy, musicie nagiąć domyślne funkcjonowanie i skonwertować na literały używając metody "ToString":
Console.WriteLine(a.ToString() + b.ToString() + "a");
Efekt będzie identyczny dla podstawienia znaku 'a'.
FORMATOWANIE ZŁOŻONE
Jest jeszcze coś, o czym musicie wiedzieć. Na tym formatowanie łańcuchów znaków w języku C# się nie kończy bowiem istnieje jeszcze lepszy sposób na łączenie ze sobą składników różnych typów, na styl funkcji "printf" z języka C. Otóż można zastosować coś, co dokumentacja określa jako "formatowanie złożone" (ang. composite formatting). Polega to na osadzeniu specjalnych indeksów wewnątrz klamerek, które potem zostaną zamienione na podawane po przecinku wartości.
Przypuśćmy, że mamy taki zapis wykorzystujący konkatenację:
Console.WriteLine(5 + "*" + 2 + " = " + (5*2));
To tak wygląda uzyskanie tego samego efektu, wykorzystując formatowanie złożone:
Console.WriteLine("{0}*{1} = {2}", 5, 2, 10);
Od razu lepiej, moim zdaniem. Śmiem tak twierdzić ze względu na redukcję "plusów" i nawiasów. Wymieniając argumenty po przecinku, pozbywamy się istnej "liany" interpunkcyjnej :D.
Chcę jeszcze Was zatrzymać na moment, abyście zerknęli na całą "magię" jaka się za tym kryje. Indeks o którym wspomniałem przyjmuje taką formę:
{0}
Osadzamy cyfrę wewnątrz klamerek. Każdy następny indeks ma podnosić cyferkę o jeden, tym sposobem nadając kolejność oczekiwanych parametrów zaraz po literale znakowym. Zawsze rozpoczynamy od zera, tak jak dla argumentów tablicy. Dlatego, po łańcuchu:
"{0}*{1} = {2}"
można wydedukować, że funkcja będzie potrzebować trzech wartości w miejsce każdego z indeksów. To może być liczba całkowita, liczba zmiennoprzecinkowa, łańcuch znaków, "boolean" lub cokolwiek innego. Grunt, żebyście nie zapominali o wymienieniu wartości po przecinku wewnątrz wywołania funkcji oraz uważali na znaki klamrowe. Gdyby się ktoś zastanawiał jak to możliwe, że jednego razu można podać tylko jeden parametr, a drugiego tyle ile się chce, to jest to działanie tzw. "zmiennej liczby argumentów". Dla niej też będzie poświęcony osobny wpis.
Pamiętajcie również, że liczba podanych wewnątrz łańcucha indeksów musi się zgadzać z liczbą wprowadzonych wartości i na odwrót! Podając na wyrost, szkodzicie sami sobie, bo program nadal będzie nadawać się do kompilacji. A czy nie będzie z nim problemów po uruchomieniu...to już nie jest broszka kompilatora (zostanie zgłoszony wyjątek!).
INTERPOLACJA ŁAŃCUCHÓW ZNAKÓW
Jeśli korzystacie z C# w wersji 6.0 lub wyższej, formatowanie łańcuchów znaków w języku C# staje się jeszcze bardziej poszerzone bowiem macie możliwość skorzystania z jeszcze jednej metody jaką jest "interpolacja". Przekładając to na język polski, to jest możliwość osadzenia wartości lub wyrażeń w miejsce tych samych nawiasów klamrowych. Główną rolę odgrywają znowu klamerki, ale teraz zamiast cyferek i podstawiania na uboczu, wstawiamy wartość albo wyrażenie bezpośrednio wewnątrz nich. Prosty przykład i kończymy:
Console.WriteLine($"{5}*{2} = {5*2}");
Jedyny maleńki szczegół "uaktywnia" interpolację. To jest znak dolara poprzedzający łańcuch, który jest obligatoryjny!
Formatowanie łańcuchów znaków w języku C# może zostać zrealizowane na wiele sposobów przy użyciu ciągle tej samej metody!
Znowu trzeba było rozgrzebać prosty temat i rozbić go na drobne atomy :). Artykuł choć długi, mam nadzieję że pomoże opanować powyższe zagadnienie.