D blokk · Metódusok · 2. tananyag
A D1-es metódusaink mindig
ugyanazt csinálták. Az igazi erő ott kezdődik, amikor a metódusnak
bemenete és kimenete van: adatot kap,
dolgozik vele, eredményt ad vissza. A fejezet végére a
B8-as
Siker(string szoveg) fejléc utolsó
ismeretlenje is a helyére kerül — és a
makacs
beolvasásból egyszer megírt, bárhonnan hívható eszköz lesz.
return-nel, és a hívást kifejezésként
használod.int Osszead(int a, int b).Konzol.SzamotKer(…).Udvozol("Anna"); Udvozol("Bence"); void Udvozol(string nev) { Console.WriteLine($"Szia, {nev}! Örülök, hogy itt vagy."); }
string nev — típus + név, mint egy
változódeklaráció. Az is: a paraméter a metódus helyi
változója, amely a hívástól kapja az értékét."Anna", "Bence".
Ugyanaz a törzs — más bemenet, más kimenet.Több paraméter vesszővel:
Vonal('=', 20); Vonal('-', 30); void Vonal(char jel, int hossz) { for (int i = 0; i < hossz; i++) { Console.Write(jel); } Console.WriteLine(); }
Az argumentumok sorrendje és típusa kötött: az első a
jel, a második a
hossz. Ha felcseréled, a fordító szól
(CS1503) — a típusrendszer
(B1) itt is véd.
Eddig a metódusaink csak csináltak valamit. A visszatérési értékű metódus eredményt ad, amellyel a hívó tovább dolgozhat:
int osszeg = Osszead(3, 4); Console.WriteLine(osszeg); // 7 Console.WriteLine(Osszead(10, 20)); // 30 — a hívás kifejezés! int Osszead(int a, int b) { return a + b; }
void helyét a
visszatérési típus vette át: ez a metódus
int-et ad vissza.return kettőt tesz:
megadja az eredményt, ÉS azonnal kilép a
metódusból.A return korai kilépésre is jó — a
C3-as
őrfeltétel-gondolat metódusban:
string Minosites(int pontszam) { if (pontszam < 0 || pontszam > 100) { return "érvénytelen pontszám"; // itt azonnal vége } if (pontszam >= 85) { return "jeles"; } return "még gyakorolj"; // minden más eset }
Ha van olyan kódútvonal, amelyen a metódus return
nélkül érne véget, CS0161 fordítási hibát kapsz. Ezért áll a lánc
végén egy „feltétel nélküli” return — az a „minden más” eset.
Bool-t visszaadó metódus — a C1-es feltételekkel kéz a kézben:
if (Paros(szam)) { Console.WriteLine("Páros!"); } bool Paros(int ertek) { return ertek % 2 == 0; // a hasonlítás eredménye bool — pont jó }
int szam = 10; Duplazo(szam); Console.WriteLine(szam); // 10 — NEM változott! void Duplazo(int ertek) { ertek *= 2; // csak a helyi másolat duplázódott }
A paraméter a hívott metódus saját változója, amely az argumentum másolatát kapja (B1: az értéktípusok másolódnak). A metódus a hívó változóját nem éri el — és ez így van jól: a metódus nem tud „belenyúlni” a hívó adataiba.
Ha az eredmény kell, a helyes út a return:
int szam = 10; szam = Duplaz(szam); // a hívó DÖNT: felülírja a sajátját Console.WriteLine(szam); // 20 int Duplaz(int ertek) { return ertek * 2; }
A B6-os
TryParse out kulcsszava pont ez alól a
szabály alól ad kivételt: azzal a metódus mégis a hívó változójába ír.
A D3-ban járjuk körül, hogyan és mikor.
Döntsd el a feladatról: kell-e bemenet, és kell-e visszaadott eredmény?
A C5-ös makacs
beolvasást eddig minden programba újra be kellett gépelni.
Metódusként egyszer írjuk meg — a
Konzol.cs-be, hogy minden projektünkben
kéznél legyen:
public static int SzamotKer(string kerdes) { int ertek; Console.Write(kerdes); while (!int.TryParse(Console.ReadLine(), out ertek)) { Hiba("Egész számot kérek — próbáld újra!"); Console.Write(kerdes); } return ertek; }
Használata bármelyik programban:
int eletkor = Konzol.SzamotKer("Hány éves vagy? "); int tipp = Konzol.SzamotKer("Tipped (1–100): ");
Két sor — és mindkét bekérés hibatűrő. Figyeld meg a fejlécen az egész
fejezetet: string bemenet (a kérdés),
int kimenet (a beolvasott szám), a törzsben
pedig a C5-ös recept. (A Konzol.cs-en
belül a Hiba(…) hívható
Konzol. előtag nélkül — saját osztályán
belül vagyunk.)
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
CS0161: not all code paths return a value | van olyan kódútvonal, ahol nincs return | a lánc végére feltétel nélküli return (2. szakasz) |
CS0029 a return sorában | a visszaadott érték típusa nem egyezik a fejléccel | int metódus int-et adjon — vagy igazítsd a fejlécet |
CS1503: cannot convert from… | az argumentumok sorrendje vagy típusa nem stimmel | nézd a fejlécet: első paraméter — első argumentum |
CS7036: There is no argument given… | kevesebb argumentumot adtál, mint ahány paraméter van | annyi argumentum, ahány paraméter (kivételek: D3) |
CS0162: Unreachable code detected | a return utáni sor sosem futhat le | a return azonnal kilép — ami utána áll az ágban, törölhető |
int x = Koszones(); nem fordul | void metódust használtál értékként | a void nem ad vissza semmit — értékhez visszatérési típus kell |
| a hívó változója „nem változik meg” | érték szerinti átadás: a metódus másolatot kapott | add vissza return-nel, és írd felül a hívónál (3. szakasz) |
SzamKitalalo projektet (benne a
Konzol.cs).Konzol.cs-be a 4. szakasz
SzamotKer metódusát, és teszteld egy
egyszerű bekéréssel.Konzol.SzamotKer(…) hívással történjen.
Számold meg, hány sorral rövidült a program!bool Talalt(int tipp, int titkos)
metódust is, amely eldönti a találatot — és használd a ciklus
feltételében.Konzol.SzamotKer + parameteres metodusok.A számkitaláló ugyanúgy működik, mint eddig, de a Program.cs
érezhetően rövidebb; a SzamotKer betűre és
rossz számra is újrakérdez.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Névre szóló üdvözlés: írj Udvozol(string nev)
metódust, és hívd meg három különböző névvel.
Rugalmas vonalhúzó: írd át a
D1.2-es
Vonal() metódust úgy, hogy paraméterként
kapja a hosszt ÉS a karaktert — húzz vele háromféle vonalat.
A nagyobbik, metódusban: írj
int Nagyobb(int a, int b) metódust
(C1.3
emléke!), és használd két bekért számra. Mit adjon, ha egyenlők?
Döntsd el, és kommentben indokold.
Átlag-metódus: írj double Atlag(int a, int b)
metódust. Vigyázz: a
B3-as
egészosztás-csapda metóduson belül is csapda! Ellenőrizd az 5 és
6 átlagával.
Konzol.IgenNem: írj a Konzol.cs-be
public static bool IgenNem(string kerdes)
metódust: kiírja a kérdést, és egyetlen billentyűt fogad el —
i-re igazat, n-re
hamisat ad vissza, minden másra újra kérdez
(C5
do-while!). Használd egy rövid programban: „Kérsz még egy
kört?”
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| paraméter | a fejlécben deklarált „bemeneti változó”: (string nev) — a hívástól kapja értékét |
| argumentum | a híváskor ténylegesen átadott érték: Udvozol("Anna") |
| visszatérési típus | a fejléc első tagja: mit ad vissza a metódus (int, bool, … — vagy void: semmit) |
return | megadja az eredményt ÉS azonnal kilép a metódusból |
| kifejezés-hívás | a visszatérési értékű hívásnak értéke van: változóba, kiírásba, feltételbe tehető |
| érték szerinti átadás | a paraméter az argumentum másolatát kapja — a hívó változója nem módosul |
| kódútvonal-lefedés | minden lehetséges úton kell return — különben CS0161 |
return eredményt ad
és azonnal kilép; a visszatérési értékű hívás
kifejezés, amellyel tovább számolhatsz.return — a
lánc végi feltétel nélküli return a
bevett lezárás.return + felülírás.Konzol.SzamotKer(…)
megszületett: a makacs beolvasás mostantól egyetlen hívás. Így
válik a recept eszközzé.out
meg a ref? Ez a következő fejezet.