Citirea datelor în C# cu Console.ReadLine și TryParse
Citește numere în C# cu Console.ReadLine și int.TryParse. Separă textul invalid de limitele problemei și tratează corect sfârșitul intrării.
În acest material
Textul introdus în consolă nu devine automat număr. Console.ReadLine() returnează textul unei linii, fără separatorul de linie. Dacă intrarea s-a terminat, rezultatul este null, adică absența unei valori. O linie goală există, dar conține zero caractere; nu este același lucru cu sfârșitul intrării. Notația string? arată că variabila poate conține un text sau null.
Pentru a obține un întreg folosim int.TryParse. Metoda încearcă conversia și întoarce un bool care spune dacă a reușit. În același timp, parametrul out primește valoarea numerică. Cele două rezultate au roluri distincte: succesul conversiei și numărul citit.
Ideea pe care o folosim
În apelul int.TryParse(text, out int number), declarăm variabila number chiar la locul apelului. Dacă rezultatul bool este false, nu folosim number ca și cum ar fi o intrare validă. În particular, zero este o valoare numerică legitimă și nu poate înlocui verificarea succesului.
Conversia și validarea domeniului sunt două etape separate. Textul „101” se convertește corect în int, dar poate încălca o cerință care permite numai valori până la 100. Textul „doi” nu poate trece nici de prima etapă.
Intrare și rezultat
Citim o singură linie care trebuie să reprezinte un întreg între 0 și 100 inclusiv. Dacă textul lipsește, nu are format întreg sau depășește intervalul tipului int, afișăm TEXT_INVALID. Dacă numărul se convertește, dar este în afara intervalului 0..100, afișăm IN_AFARA_LIMITELOR. Altfel afișăm dublul lui. Programul se oprește după primul rezultat.
Exemplu urmărit
Pentru linia „42”, TryParse reușește, number primește 42, verificarea limitelor trece și afișăm 84. Pentru „101”, conversia reușește, dar verificarea domeniului produce IN_AFARA_LIMITELOR. Pentru „42.5”, conversia la int eșuează și afișăm TEXT_INVALID. Nu rotunjim și nu tăiem partea fracționară a textului.
42 se convertește și respectă limitele, 101 se convertește dar depășește domeniul, iar 42.5 nu este text întreg.Mărește schema ↗
De ce obținem acest rezultat
Ordinea verificărilor împiedică folosirea datelor înainte de validare. Primul if tratează conversia; return încheie Main în caz de eroare. Al doilea if verifică restricția problemei numai după o conversie reușită. Abia apoi calculăm dublul, care este cel mult 200. Numărul zero trece ambele verificări și produce zero, fără să fie confundat cu un eșec.
Program complet C#
using System;
class Program
{
static void Main()
{
string? text = Console.ReadLine();
if (!int.TryParse(text, out int number))
{
Console.WriteLine("TEXT_INVALID");
return;
}
if (number < 0 || number > 100)
{
Console.WriteLine("IN_AFARA_LIMITELOR");
return;
}
Console.WriteLine(2 * number);
}
}
Greșeli de evitat
Nu folosi int.Parse fără să decizi cum tratezi o conversie nereușită: acesta poate arunca o excepție pentru un text invalid. TryParse este potrivit când invaliditatea reprezintă o ramură obișnuită a programului. Nu afișa mesaje suplimentare precum „Introdu numărul” dacă formatul rezultatului cere numai răspunsul; acestea ar modifica ieșirea verificată automat.
Exersează
- Ce produce „0”? Răspuns: 0, fiind o intrare validă.
- Ce produce „−1”? Răspuns: IN_AFARA_LIMITELOR, deoarece conversia reușește.
- Ce produce o linie goală? Răspuns: TEXT_INVALID. La fel și un număr prea mare pentru int, precum 999999999999.
Continuă parcursul C#
Vezi Primul program C#: Console.WriteLine și Main. Vezi Variabile și tipuri în C#: int, double și bool. Vezi Condiții în C#: if, else și operatori logici.
Documentație de referință: Microsoft Learn.
Întrebări frecvente
Ce întoarce Console.ReadLine la finalul intrării?
Null, adică lipsa unei linii. O linie goală introdusă cu Enter este un text gol, nu null.
Ce rol are out în TryParse?
Permite metodei să scrie rezultatul numeric în variabila indicată. Valoarea bool întoarsă separat arată dacă rezultatul este valid.
TryParse verifică și limitele problemei?
Nu. Verifică posibilitatea conversiei la tipul cerut. Restricții precum 0..100 se verifică explicit după succesul conversiei.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.