Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:
Funkce, kterou se snažíš použít je dostupná pouze pro registrované uživatele. Buďto se přihlas nebo si zdarma vytvoř nový účet.

Diskusia – 5. diel - Typový systém druhýkrát - Dátové typy v C# .NET

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
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í".

Odpovedať
Jestli v životě najdeš cestu bez překážek, určitě nikam nevede. -Arthur C. Clarke
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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á.

Odpovedať
New kid back on the block with a R.I.P
Avatar
Odpovedá 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?).

Odpovedať
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 :-)

Avatar
Jakub Švasta
Lektor
Avatar
Odpovedá 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š. :-)

Avatar
Honza
Člen
Avatar
Odpovedá 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

Avatar
Jakub Švasta
Lektor
Avatar
Odpovedá 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. :-)

Avatar
David
Člen
Avatar
David:25.2.2020 9:19

Skvělá práce. ;-)

Avatar
Odpovedá 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

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

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 159.