NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

Diskuze – Lekce 5 - Typový systém podruhé - Datové typy v C# .NET

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Ondřej Fiala:27.3.2019 14:20

Pořád nechápu to PadRight a Left a Trim. Nechápu k čemu to je. Mluvim o tom kódu s trimem nahoře. Zadám číslo a stejně se nic nezmění. Když dam číslo 1 a tisíc mezer před ním, tak se to stejně zobrazí hned za : a úplně ta samá hodnota vyjde i po tom "trimování".

Odpovědět
27.3.2019 14:20
Jestli v životě najdeš cestu bez překážek, určitě nikam nevede. -Arthur C. Clarke
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Ondřej Fiala
David Hartinger:27.3.2019 15:42

Když zadáš číslo, tak se nic nezmění, to máš pravdu. Je to také v článku uvedené, že parsování ty mezery trimuje samo. Ale co když zadáš text? Třeba se uživatele zeptáš na otázku ano/ne, tam nechceš řešit, že zadal mezery před/za a pak se ti to špatně porovná.

Odpovědět
27.3.2019 15:42
New kid back on the block with a R.I.P
Avatar
Odpovídá na Ondřej Fiala
Neaktivní uživatel:27.3.2019 18:26

Ještě doplním Davida o <code>PadLeft</co­de> a <code>PadRight</co­de>. Ano, mohl bys je nahradit for cyklem, ale proč to dělat? Chceš tabulku? Při troše snahy ji uděláš z čehokoli a nemusíš psát o <code>for</code> víc. Chceš podtrhnout nadpis? Oddělit od sebe něco? <code>"".PadLef­t(Console.Win­dowWidth, '-')</code> je tvůj dobrý kamarád (ano, je to celkem šílenost, ale proč tak krásnou příležitost nevyužít?).

Odpovědět
27.3.2019 18:26
Neaktivní uživatelský účet
Avatar
Honza
Člen
Avatar
Honza:2.2.2020 18:45

Mám prosbu, nerozumím následujícímu:

volání na proměnné, např.:

string s = "Java je nejlepší!";
s = s.Replace("Java", "C#");

int cislo = 3;
string s = soucet.ToString();

a naproti tomu volání na datovém typu:

string s = string.Format("Když sečteme {0} a {1}, dostaneme {2}", a, b, c);
int a = int.Parse(s);

proč se některé funkce (metody) jednou volají na proměnné a jindy na datovém typu? Nejsem schopen si to pamatovat tak, že si to nabifluju, potřeboval bych to pochopit. Děkuju :-)

 
Odpovědět
2.2.2020 18:45
Avatar
Jakub Švasta
Lektor
Avatar
Odpovídá na Honza
Jakub Švasta:3.2.2020 0:10

Protože je C# objektový jazyk, k úplnému pochopení je potřeba znalost OOP. Ale prozatím se dá říct, že metody volané na datovém typu jsou takové obecnější. Metody volané na proměnné nějak pracují přímo s tou proměnnou. Když mám proměnnou s obsahující text "Java je nejlepší", tak metoda Replace vezme přímo ten text "Java je nejlepší" z té proměnné, vymění "Java" za "C#" a výsledek vrátí. Ale někdy se stane, že potřebuješ něco udělat, a žádnou proměnnou, s kterou bys pracoval, nemáš. Třeba u té metody Format sestavuješ řetězec, a nemáš žádnou "počáteční" proměnnou, na které bys ji mohl zavolat. Celý řetězec sestavuješ až v parametru. Tak C# implementoval metodu Format tak, aby se dala zavolat na datovém typu. Podobně u té metody Parse. Chceš naparsovat text na číslo, a výsledek uložit do proměnné typu int. Ale na začátku žádnou proměnnou typu int nemáš, tu teprve vytváříš. Tak C# umožňuje volat parsování přímo na datovém typu.

Ale když jsem říkal, že metody na datovém typu jsou obecnější, tak to v tomhle případě neznamená lepší. Jak se dozvíš dál, správnější je spíš to, co jde, volat na proměnné. Na datovém typu se volají jen věci, co nejdou jinak udělat, nebo jen krkolomně.

Jinak není potřeba si nic pamatovat. Když za proměnnou napíšeš tečku, Visual Studio ti rozbalí nabídku metod, které na dané proměnné můžeš zavolat. A u datového typu to funguje stejně. Nicméně všechny v článku uváděné metody (snad až na PadLeft a PadRight) se používají natolik běžně, že časem si je stejně zapamatuješ. :-)

 
Odpovědět
3.2.2020 0:10
Avatar
Honza
Člen
Avatar
Odpovídá na Jakub Švasta
Honza:3.2.2020 11:39

Paráda, děkuju za odpověď, obecně rozumím, důležité z Tvého příspěvku je:

  • Metody volané na proměnné nějak pracují přímo s tou proměnnou.
  • Ale někdy se stane, že potřebuješ něco udělat, a žádnou proměnnou, s kterou bys pracoval, nemáš. (pak se volá metoda na datovém typu)
  • správnější je spíš to, co jde, volat na proměnné.

K tomu ale opět jeden dotaz

int cislo = 3;
string s = cislo.ToString();

string s = "5";
int a = int.Parse(s);

Tady bych podle Tvého vysvětlení očekával, že by bylo správnější volat něco jako int a = s.Parse(); A to proto, že proměnnou, nad kterou chci volat Parse, v tomto případě mám.

... možná si odpovím sám - důvod by mohl být ten, že by Parse nevědelo, jaký datový typ má vrátit (jestli int, float, ...)

Tak to jsem zvědav, jak se tím prokoušu. Každopádně díky

 
Odpovědět
3.2.2020 11:39
Avatar
Jakub Švasta
Lektor
Avatar
Odpovídá na Honza
Jakub Švasta:3.2.2020 21:40

Máš talent. :-) Jen pro upřesnění, to, že když nemáš proměnnou, voláš metodu na datovém typu, neber jako pravidlo. To jsem myslel jen jako příklad, kdy má třeba volání metody na datovém typu smysl. Na datovém typu se prostě dají volat metody, které ten datový typ nabízí. A tvůrci C# tam dali takové, které zpravidla umožňují elegantnější zápis něčeho, co by se jinak dělalo blbě. Ale můžeš je brát spíš jako takové výjimky, ono jich je relativně málo.

U toho Parse sis opravdu odpověděl sám. :-) Přesně, nevědělo by se, co vracet. Teoreticky by mohly existovat metody ParseToFloat, ParseToInt apod., případně elegantněji pomocí generiky (poznáš později), ale pak by na stringové proměnné musela být hromada metod pro všechny možné návratové typy. A stejně by to nestačilo, protože si můžeš dokonce vytvořit datový typ vlastní (třeba pro komplexní číslo), a pro něj by tam pak parsovací metoda chyběla. Navíc u některých datových typů může být parsování složité - u čísel asi tolik ne, ale taky se dá parsovat třeba datum, které může být v X různých formátech (začínající rokem, začínající dnem, oddělovačem je tečka, lomítko, atd.). Je logičtější, aby zodpovědnost za správné naparsování byla na výsledném datovém typu, který ví, jak má výsledek správně fungovat.

Ale to už zabíháme zbytečně do detailů. Tomu, co teď potřebuješ, rozumíš beze zbytku, a můžeš se s klidným svědomím posunout dál. Kompletní souvislosti pochopíš u OOP. :-)

 
Odpovědět
3.2.2020 21:40
Avatar
David
Člen
Avatar
David:25.2.2020 9:19

Skvělá práce. ;-)

 
Odpovědět
25.2.2020 9:19
Avatar
Odpovídá na Ladik Šotik
Marek Vajčner:29.2.2020 16:02

Jo jo ještě dva takové články a bude to chtít nějakou referenční příručku. :-D

 
Odpovědět
29.2.2020 16:02
Avatar
Jaromír Vikukel:6.4.2020 14:36

Dobrý den, zaujala mne poznámka u datových typů float a double. Není mi jasné, kde dochází k určité ztrátě přesnosti. Do binární soustavy se snad nechá konvertovat libovolné dekadické číslo? V praxi jsem se setkával s použitím datových typů float a double i ve finančních výpočtech. Znamená poznámka, že zde vždycky existovalo riziko odchylek? Dále: co znamená u popisu těchto datových typů sloupec "přesnost"? Je to počet míst za desetinnou čárkou? Díky

 
Odpovědět
6.4.2020 14:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 159.