D blokk · Metódusok · 1. tananyag
A C blokk végére a programjaid ütőképesek — de kezdenek hosszúra
nyúlni, és az ismétlődő részek másolgatása egyre kockázatosabb. A
megoldás a metódus: névvel ellátott kódrészlet,
amelyet egyszer írsz meg, és bárhonnan meghívhatsz. És ma megfejtjük
a rejtély első felét: mit jelent a void a
B8-as
Konzol.cs-ben.
void +
név + () — és tudod, mit jelent a
void.Konzol
osztályt.A C6-os Mintagyárban a menüt minden kör elején kirajzoljuk. Ha egy sort módosítani akarsz rajta, jó eséllyel több helyen kell — és ha egy helyen elfelejted, a program következetlenné válik. Ez a másolt kód átka.
A szakma erre külön elvet tart számon: DRY — Don't Repeat Yourself, azaz „ne ismételd önmagad”. Az ismétlődő kódrészletnek egy helye legyen, és onnan használd mindenhol. C#-ban ennek az eszköze a metódus.
A Console.WriteLine, az
int.Parse, a
Konzol.Cim — mind metódus: mások által
megírt, névvel ellátott kódrészlet. Az első napod óta hívod őket
(A6).
Ma megírod a sajátjaidat.
Koszones(); Console.WriteLine("A program dolgozik…"); Koszones(); void Koszones() { Console.WriteLine("═══════════════════"); Console.WriteLine(" Üdv a programban!"); Console.WriteLine("═══════════════════"); }
Két rész:
void Koszones() fejléc + a
{ } közti törzs. Ez
önmagában nem fut le — csak leírja, mit jelent a
név.Koszones();
— ekkor fut le a törzs. Ahányszor hívod, annyiszor.A kimenetben a keretes üdvözlés kétszer jelenik meg — pedig a kódját csak egyszer írtad le. Pontosan ez a cél.
A top-level programban a szokásunk (és a legolvashatóbb): a futó utasítások elöl, a metódusdefiníciók a fájl végén. A hívás nyugodtan megelőzheti a definíciót — a fordító a teljes fájlt látja.
| Rész | Jelentés |
|---|---|
void | a visszatérési típus helye — a void azt jelenti: ez a metódus nem ad vissza értéket, csak elvégez valamit |
Koszones | a metódus neve — PascalCase, igés: mit csinál? (Koszones, MenutRajzol) |
() | a paraméterlista — most üres; a D2-ben ide kerül majd a metódus bemenete |
És most nézd meg újra a
B8-as
Konzol.cs egy fejlécét:
public static void Siker(string szoveg)
void már ismerős: a
Siker sem ad vissza értéket, „csak”
kiír;(string szoveg) a D2 témája — a metódus
bemenete;public static a D4-ben kerül sorra —
addig annyi elég: ettől hívható
Konzol.Siker(…) alakban bárhonnan.A rejtély fele tehát megvan — és a blokk végére a teljes fejlécet folyékonyan olvasod majd.
Console.WriteLine("A"); // 1. Koszones(); // 2. → a vezérlés BEUGRIK a törzsbe Console.WriteLine("B"); // 4. ← a törzs végén IDE tér vissza void Koszones() { Console.WriteLine("Üdv!"); // 3. }
A program tehát nem „fentről lefelé” fut többé, hanem a hívások mentén ugrik — de mindig pontosan oda tér vissza, ahonnan elugrott.
Ezt a debuggerrel a saját szemeddel is követheted (A9):
| Billentyű | Név | Mit csinál a híváson állva? |
|---|---|---|
| F11 | Step Into | belép a metódus törzsébe — soronként követed odabent |
| F10 | Step Over | átlépi a hívást — a metódus lefut, de egy lépésnek látod |
Döntsd el: érdemes-e az adott kódrészletet metódusba kiemelni?
A B8-ban
ígértük: a Konzol osztály velünk nő. Most
először te írsz bele metódust. Nyisd meg a
Konzol.cs-t, és a meglévő metódusok mellé
vedd fel:
public static void Elvalaszto() { Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("────────────────────────────"); Console.ResetColor(); }
Használata bárhonnan: Konzol.Elvalaszto(); —
és a programjaid kimenete egységesen tagolt lesz. Figyeld meg:
pontosan úgy építkezik, mint a
Siker — színt állít, kiír, színt
visszaállít. A mintát másoltad, a tartalmat te írtad: így nő egy
segédosztály.
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
| a metódus „nem csinál semmit” | csak definiáltad, de sehol sem hívtad meg | a definíció önmagában nem fut — kell a Koszones(); hívás |
CS0201 a Koszones; sorra | a hívásról lemaradt a () | metódust mindig zárójellel hívunk: Koszones(); |
CS0103 egy változóra a metóduson kívül | a változó a metódus törzsében született | a metódusban deklarált változó csak ott él (a C4-es hatókör-szabály rokona) |
CS0128: ugyanaz a metódusnév kétszer | két azonos nevű definíció | egy név — egy definíció (a „hasonló, de más” esetre a D3-as túlterhelés lesz a válasz) |
a program StackOverflowException-nel leáll | a metódus véletlenül önmagát hívja | a törzsből ne hívd ugyanazt a metódust |
| kisbetűs metódusnév | működik, de sérti a konvenciót | metódusnév PascalCase-zel és igével: MenutRajzol |
; a fejléc után: void Koszones(); | a definícióból törzs nélküli „ígéret” lett | a fejléc után nem ;, hanem { } törzs áll |
MintaGyar projektet (benne a
Konzol.cs).FoMenu() metódusba — a do-while törzsében
csak a hívás maradjon. Futtasd: kívülről semmi sem változott, belül
rend lett.Konzol.cs-t az 5. szakasz
Elvalaszto() metódusával, és hívd meg
minden menüpont lefutása után.Bucsuzas() a kilépő üzenetnek).FoMenu();
hívásra, és próbáld ki az F11-et és az F10-et — nézd meg a
különbséget!Mintagyar metodusokkal strukturalva.A program pontosan úgy működik, mint eddig; a do-while törzse rövid és
olvasható; a Konzol.Elvalaszto() működik.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Háromszoros üdvözlés: írj Koszones()
metódust, amely kiírja a neved keretben — és hívd meg háromszor.
Hány sor kódot spóroltál a másoláshoz képest?
Vonalhúzó: írj Vonal() metódust, amely
30 kötőjelet ír ki egy sorba
(C4-es ciklussal!) —
és tagolj vele egy háromrészes kiírást.
Logó: tervezz 4-5 soros „ASCII-logót” a saját monogramodból, tedd
Logo() metódusba, és írasd ki a program
elején és végén.
Konzol-bővítés: vedd fel a Konzol.cs-be a
Figyelem() metódust (sárga szín, ⚠ jel —
a B8.4-es
feladat, de most már érted, mit írsz!), és használd egy rövid
programban a Siker/Hiba
mellett.
Refaktor: vedd elő a C7-es fagylaltozó-kasszádat (vagy az átváltót), és szervezd metódusokba az ismétlődő/összefüggő részeit (menürajzolás, búcsúzás, elválasztók). A működés nem változhat — a do-while törzse viszont férjen el egy képernyőn.
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| metódus | névvel ellátott kódrészlet — egyszer definiálod, akárhányszor meghívod |
| definíció | a fejléc + törzs leírása — önmagában nem fut le |
| hívás | MetodusNev(); — ekkor fut le a törzs |
| fejléc | visszatérési típus + név + paraméterlista: void Koszones() |
| törzs | a { } közti utasítások |
void | „nem ad vissza értéket” — a metódus csak elvégez valamit |
| vezérlésátadás | híváskor a futás beugrik a törzsbe, majd visszatér a hívás utáni sorra |
| DRY-elv | Don't Repeat Yourself: az ismétlődő kódnak egy helye legyen |
| Step Into / Step Over | F11: belépés a hívott metódusba; F10: átlépés fölötte |
void (nincs visszatérési
érték) + PascalCase, igés név + üres
(); a definíció a fájl végére, a hívás
bárhová.Konzol osztályba először írtál saját
metódust — a B8-as fájl többé nem „csak használt” kód: kezded
érteni, hogyan épül fel.