Metóda Console.ReadLine
je veľmi užitočná funkcia, ktorú nájdeme v jazyku C#. Slúži na načítanie riadku textu, ktorý používateľ zadá v konzole, a na jeho konverziu na reťazec (string).
Použitie tejto metódy je jednoduché. Stačí ju zavolať v rámci programu v konzolovej aplikácii, aby sa program zastavil a počkal, kým používateľ zadá text a stlačí klávesu Enter
. Toto je veľmi užitočné v situáciách, keď chcete od používateľa požadovať nejaké informácie alebo dáta.
Nasledujúci príklad ukazuje, ako získať meno používateľa:
Console.WriteLine("Ako sa voláš?");
string? meno = Console.ReadLine();
Console.WriteLine("Ahoj, " + meno);
V tomto príklade program vypíše otázku "Ako sa voláš?"
, potom použije metódu Console.ReadLine
na načítanie mena, ktoré používateľ zadá, a nakoniec toto meno použije v uvítacej správe.
Ak chcete konvertovať vstup získaný pomocou Console.ReadLine
na iný dátový typ, napríklad int
alebo double
, môžete použiť metódy int.Parse
alebo double.Parse
. Napríklad:
Poznámka:
Znak ?
za typom string
v C# označuje tzv. nullable referenčný typ. Tento koncept bol predstavený v C# 8.0 a umožňuje, aby referenčné typy mohli bezpečne reprezentovať a manipulovať stav null
.
V našom prípade string? meno = Console.ReadLine();
to znamená, že premenná meno
môže obsahovať buď reťazec alebo null
. Toto je užitočné v prípadoch, keď nevieme, či nám metóda vráti platnú hodnotu alebo null
. Metóda Console.ReadLine()
napríklad vráti null
, keď je konzolový vstup zatvorený.
K tomuto sa ešte treba dodať, že v niektorých konfiguráciách projektu môže byť používanie nullable referenčných typov vypnuté. V takom prípade by kód string? meno = Console.ReadLine();
mohol spôsobiť chybu kompilátora. Ak chceme v takom projekte používať nullable referenčné typy, môžeme to povoliť v nastaveniach projektu.
Console.WriteLine("Koľko máš rokov?");
string vstup = Console.ReadLine() ?? "0";
int vek = int.Parse(vstup);
Console.WriteLine("Máš " + vek + " rokov.");
V tomto príklade program vypíše otázku "Koľko máš rokov?", načíta vstup od používateľa, premení ho na celé číslo a vypíše vek používateľa. Ak používateľ zadá niečo, čo nie je možné premeniť na celé číslo, program vygeneruje chybu. Preto je dôležité pridať ošetrenie chýb pri práci s užívateľským vstupom.
Poznámka:
Kód string vstup = Console.ReadLine() ?? "0";
využíva tzv. "null-coalescing operator", ktorý je označený ako ??
.
Tento operátor sa používa na poskytnutie výchozej hodnoty pre nullable hodnoty. Konkrétne, operátor ??
vráti ľavý operand, ak ten nie je null
. Ak je však ľavý operand null
, potom vráti pravý operand.
V našom prípade, ak Console.ReadLine()
vráti null
(čo sa stane, ak je konzolový vstup prázdny), potom operátor ??
vráti hodnotu "0". Takže premenná vstup
bude mať hodnotu "0". Ak Console.ReadLine()
vráti nejaký reťazec, potom vstup
bude mať túto hodnotu.
Tento operátor je užitočný pri práci s nullable hodnotami, pretože nám umožňuje jednoducho poskytnúť výchozí hodnotu v prípade, že hodnota je null
.
Tieto príklady môžete skúsiť priamo v konzolovej aplikácii. V tomto prípade máme už vytvorenú ukážkovú konzolovú aplikáciu v adresári src\AppsLab-008-ConsoleReadLine
.
- Otvorte riešenie (solution)
AppsLab.CSharp.Exercises.sln
v programe Visual Studio 2022. - Nájdite projekt AppsLab-008-ConsoleReadLine v rámci riešenia v paneli Solution Explorer.
- Kliknite pravým tlačidlom myši na projekt a zvoľte možnosť
Set as Startup Project
. - Stlačte tlačidlo
F5
na klávesnici alebo kliknite na tlačidloStart Debugging
na nástrojovej lište, aby ste spustili aplikáciu.
- Otvorte priečinok
AppsLab-008-ConsoleReadLine
v programe Visual Studio Code. - Otvorte terminál (
Ctrl+~
). - Zadajte príkaz
dotnet run
.
- Otvorte terminál.
- Prejdite do priečinku
AppsLab-008-ConsoleReadLine
pomocou príkazucd
. - Zadajte príkaz
dotnet run
.
Po spustení týchto príkazov sa spustí vaša konzolová aplikácia a môžete začať pracovať s užívateľským vstupom pomocou metódy Console.ReadLine
.
Cieľom tohto cvičenia je upraviť existujúci projekt AppsLab-008-ConsoleReadLine
tak, aby ste vedeli načítať od užívateľa ďalšie informácie. Toto cvičenie vám pomôže lepšie pochopiť, ako funguje načítanie údajov z konzoly.
-
Upravte existujúci kód tak, aby ste načítali meno a vek užívateľa. Načítanie mena môže prebiehať podobne ako v príklade s otázkou "Ako sa voláš?", ale namiesto odpovede "Ahoj, {meno}!" nech vypíše "Ahoj, {meno}! Koľko máš rokov?".
-
Potom necháte užívateľa zadať vek a vypíšete správu "Aha, máš teda {vek} rokov.".
-
Pridajte do programu ďalšiu otázku: "Aké je tvoje obľúbené jedlo?".
-
Po zadaní odpovede vypíšte správu "Hmm, {jedlo} znie skvele!".
Pracujte v priečinku src\AppsLab-008-ConsoleReadLine
. Po dokončení úloh nezabudnite uložiť a otestovať váš program.
Pri implementácii týchto úloh sa môžete riadiť nasledovnými krokmi:
-
Použite príkaz
Console.WriteLine()
na výpis otázky do konzoly. -
Použite príkaz
Console.ReadLine()
na načítanie odpovede od užívateľa. -
Uložte odpoveď do premennej a využite ju v nasledujúcom výpise.
Popracujte na formátovaní reťazcov a zabezpečte, aby vaše otázky a odpovede zneli prirodzene. Veľa šťastia!
Cieľom tohto cvičenia je preskúmať čítanie jedného znaku z konzoly pomocou metódy Console.ReadKey()
. Táto metóda je užitočná, keď chcete načítať len jeden znak, namiesto celej riadky textu.
- Upravte svoj existujúci kód tak, aby obsahoval nasledujúci riadok:
Console.WriteLine("Stlač klávesu: ");
- Pridajte nasledujúci riadok kódu za výpis:
var key = Console.ReadKey();
- Pridajte ešte jeden riadok kódu, ktorý vypíše, akú klávesu ste stlačili:
Console.WriteLine();
Console.WriteLine($"Stlačili ste klávesu: {key.KeyChar}");
Použitie Console.WriteLine();
bez argumentov, ako sme to urobili medzi načítaním a vypísaním klávesy, slúži len na presunutie kurzora na nový riadok. To nám umožňuje oddeliť výpis stlačenej klávesy od výzvy pre užívateľa.
- Spustite svoj program a skúste stlačiť rôzne klávesy na klávesnici.
Pracujte v priečinku src\AppsLab-008-ConsoleReadLine
. Po dokončení úloh nezabudnite váš program uložiť, zmeny komitnúť (commit) a pushnúť do zdieľaného repozitára.
Poznámka: Metóda Console.ReadKey()
načíta stlačenú klávesu a vráti ju ako hodnotu typu ConsoleKeyInfo
. Tento typ obsahuje rôzne vlastnosti, ktoré môžete využiť, ako napríklad KeyChar
, ktorý predstavuje znak stlačenej klávesy. Preto sme v poslednom riadku kódu použili key.KeyChar
na zobrazenie stlačenej klávesy.
Pozor! Keďže ešte nepoznáme cykly a podmienky, metódu Console.ReadKey()
je možné použiť len na načítanie jedného znaku. Neskôr sa naučíme, ako načítať viac klávesových stlačení a ako reagovať na konkrétne stlačené klávesy.