Na základě článku o konkatenaci jsme viděli, že je velmi důležité používat StringBuilder z důvodu výkonu. Zde uvidíme, jak formátovat řetězec, větu, tento formát je často používán.
Proč String Format?
Neřeknu vám, že je to výkonnější, naopak string.Format() stojí několik milisekund navíc podle jednoduchého testu ve srovnání s konkatenovanou větou:
string jmeno = "Dupont";
string prijmeni = "Julie";
string adresa = "Rue de l'étoile";
string cislo = "10";
string psc = "75000";
string mesto = "Paříž";
//Používám Stopwatch pro měření času mého kódu
Stopwatch s = new Stopwatch();
//Spouštím Stopwatch
s.Restart();
for(int i=0; i < 100000; i++)
{
string mujZprava = string.Format("Ahoj {0} {1}, píšu vám, abych vás požádal o zaslání mého balíčku na {2}, {3} - {4} {5}",
jmeno, prijmeni, adresa, cislo, psc, mesto);
}
//Zastavuji Stopwatch
s.Stop();
//Zobrazím výsledek
Console.WriteLine(String.Format("Čas: {0}", s.Elapsed));
s.Restart();
for(int i=0; i < 100000; i++)
{
string mujZprava = "Ahoj " + jmeno + " " + prijmeni + ", píšu vám, abych vás požádal o zaslání mého balíčku na " +
adresa + ", " + cislo + " - " + psc + " " + mesto;
}
s.Stop();
Console.WriteLine(String.Format("Čas: {0}", s.Elapsed));
//Výsledek:
//string.format -> Čas: 00:00:00.0378547
//konkatenace -> Čas: 00:00:00.0134245
Druhá část kódu je méně čitelná než první část kódu, všimli jste si, že používáme string.Format() místo konkatenace proměnných (pomocí +)?
string.Format() je dobrý zvyk, který je mnohem čitelnější, ale uvidíte později, že můžeme spravovat formát výstupu řetězce.
Jak vidíte, stačí vložit do složených závorek (nebo hranatých) {x} index hodnoty, která bude nahrazena, pozor na toto:
int i = 0;
int x = 100;
string.Format("Moje hodnota je {0}, zatímco x je rovna {1}", i, x);
//Výsledek:
//Moje hodnota je 0, zatímco x je rovna 100
//Není to totéž jako toto:
string.Format("Moje hodnota je {1}, zatímco x je rovna {0}", i, x);
//Výsledek:
//Moje hodnota je 100, zatímco x je rovna 0
V příkladu výše, na druhém řádku, je první index {1}, takže nebude brát i, protože i je na pozici nula (ano, v informatice vždy začínáme od nuly a ne od 1), pozice {1} je x, zatímco index {0} je hodnota na pozici nula, tedy i.
Rozumíte?
Shrnuji, je třeba se vyhnout takovýmto konkatenacím:
string jmeno = "Dupont";
string prijmeni = "Julie";
string adresa = "Rue de l'étoile";
string cislo = "10";
string psc = "75000";
string mesto = "Paříž";
string mujZprava = "Ahoj " + jmeno + " " + prijmeni + ", píšu vám, abych vás požádal o zaslání mého balíčku na " +
adresa + ", " + cislo + " - " + psc + " " + mesto;
Console.WriteLine(mujZprava);
//Výsledek:
//Ahoj Dupont Julie, píšu vám, abych vás požádal o zaslání mého balíčku na Rue de l'étoile, 10 - 75000 Paříž
Ale raději:
string jmeno = "Dupont";
string prijmeni = "Julie";
string adresa = "Rue de l'étoile";
string cislo = "10";
string psc = "75000";
string mesto = "Paříž";
string mujZprava = string.Format("Ahoj {0} {1}, píšu vám, abych vás požádal o zaslání mého balíčku na {2}, {3} - {4} {5}",
jmeno, prijmeni, adresa, cislo, psc, mesto);
Console.WriteLine(mujZprava);
//Výsledek:
//Ahoj Dupont Julie, píšu vám, abych vás požádal o zaslání mého balíčku na Rue de l'étoile, 10 - 75000 Paříž
Další výhoda
Tady to začíná být zajímavější, díky string.Format() můžeme přímo formátovat hodnotu, jako takto:
int plat = 1000;
int hodinyPrace = 16;
string mujZprava = string.Format("Můj šéf mi platí {0:0.00}€ měsíčně za {1:0#} h práce denně.", plat, hodinyPrace);
Console.WriteLine(mujZprava);
//Můj šéf mi platí 1000,00€ měsíčně za 16 h práce denně.
hodinyPrace = 1;
mujZprava = string.Format("Můj šéf mi platí {0:0####.00}€ měsíčně za {1:0#} h práce denně.", plat, hodinyPrace);
Console.WriteLine(mujZprava);
//Můj šéf mi platí 01000,00€ měsíčně za 01 h práce denně.
mujZprava = string.Format("Jsme {0}", DateTime.Now);
Console.WriteLine(mujZprava);
//Jsme 23-04-19 16:53:54
mujZprava = string.Format("Jsme {0:dd-MM-yyyy}", DateTime.Now);
Console.WriteLine(mujZprava);
//Jsme 23-04-2019
Jak vidíte, můžeme přímo formátovat hodnotu, jak chceme, což by bylo delší při konkatenaci.
Další výhodou je, když vezmete větu z databáze nebo z resource souboru, ale tato věta musí pokaždé obsahovat různé hodnoty, stačí ji naformátovat takto:
//Zde bereme větu z resource souboru nebo dokonce z databáze
//je jedno odkud věta pochází, je to jen příklad
string.Format(resource.GetString("MojeVetaVMemResourceSouboru"), adresa, psč, město);
//MojeVetaVMemResourceSouboru = "Bydlím v {0}, PSČ {1}, město {2}"
Krátká varianta
Existuje ještě kratší verze string.Format() v C# 6 (Roslyn) od Visual Studio 2015 (je třeba přidat balíček Microsoft.Net.Compilers pro použití nových funkcí C#):
string mujZprava = string.Format("Jsme dne {0:dd-MM-yyyy}", DateTime.Now);
Console.WriteLine(mujZprava);
//Výsledek: Jsme dne 23-04-2019
mujZprava = $"Jsme dne {DateTime.Now:dd-MM-yyyy}";
Console.WriteLine(mujZprava);
//Výsledek: Jsme dne 23-04-2019
Druhý řádek představuje string.Format() trochu jinak, začínáme znakem $ (dolar) a poté je index, který byl nula v prvním řádku, přímo nahrazen a umístěn do složených závorek.
| Specifikátor formátu | Popis | Příklady | Výsledek |
|---|---|---|---|
| C nebo c | Měna | string s = $"{2.5:C}";string s = $"{-2.5:C}"; |
$2.50 ($2.50) |
| D nebo d | Desetinné | string s = $"{25:D5}"; |
00025 |
| E nebo e | Exponenciální | string s = $"{250000:E2}"; |
2.50E+005 |
| F nebo f | Pevná čárka | string s = $"{2.5:F2}";string s = $"{2.5:F0}"; |
2.50 3 |
| G nebo g | Obecné | string s = $"{2.5:G}"; |
2.5 |
| N nebo n | Číselné | string s = $"{2500000:N}"; |
2,500,000.00 |
| P nebo p | Procento | string s = $"{0.25:P}"; |
25.00% |
| R nebo r | Tam a zpět | string s = $"{2.5:R}"; |
2.5 |
| X nebo x | Hexadecimální | string s = $"{250:X}";string s = $"{0xffff:X}"; |
FA FFFF |
A mnoho dalších!
Pro více informací o string.Format() je zde dokumentace na webu Microsoft: https://docs.microsoft.com/fr-FR/dotnet/api/system.string.format?redirectedfrom=MSDN&view=netframework-4.8#System_String_Format_System_String_System_Object_
Při kompilaci se nic nemění, znak dolar je přeměněn na string.Format(), je to jen otázka zvyku, ale já to považuji za ještě čitelnější!
Aucun commentaire pour le moment.