09. TANANYAG · C# ALAPOK

Metódusok.

Saját metódusok írása és hívása

A lépésről lépésre animáció egy kockája: Visual Studio és magyarázó tábla

ANIMÁCIÓ · NARRÁLT

Lépésről lépésre

Tanári bemutató: a program üres fájlból, sorról sorra épül fel, közben a tábla mutatja a memóriát, a kiértékelést és a konzolt. A futások valódi .NET-futtatásból származnak.

12,1 perc · 12 fejezet · hang és felirat · fejezetválasztó

Lejátszás
Az áttekintő animáció egy kockája

ANIMÁCIÓ · FELIRATOS

Áttekintés

Rövid, hang nélküli összefoglaló a kód elemeiről, felirattal. Ismétléshez vagy a téma gyors felidézéséhez.

4,8 perc · felirat · saját lejátszósáv

Megnyitás
09_metodusok_kommentelt.csTeljes nézet →Letöltés
namespace _09_Metodusek // A namespace (névtér) összefogja az ehhez a példához tartozó kódelemeket; ennek a névtérnek a neve _09_Metodusek.
{ // Itt kezdődik a névtér kódblokkja.
    internal class Program // A Program nevű osztály deklarációja; ebben lesz a Main és az összes most bemutatott METÓDUS, pontosabban metódus.
    { // Itt kezdődik a Program osztály törzse.
        static void Main(string[] args) // A Main a program belépési pontja; maga is egy static és void metódus.
        { // Itt kezdődik a Main metódus törzse.
            Console.WriteLine("A program elindult.\n"); // Kiírjuk, hogy a program futása elkezdődött; a \n még egy üres sort is létrehoz.

            // 1. PÉLDA – EGYSZERŰ static void METÓDUS MEGHÍVÁSA.
            EgyszeruMetodus(); // Meghívjuk az EgyszeruMetodus() metódust; a program végrehajtja annak törzsét, majd visszatér ide a Main-be.

            // 2. PÉLDA – static void METÓDUS, AMELYBEN for CIKLUS FUT.
            SzamoljOtosig(); // Meghívjuk a SzamoljOtosig() metódust; a ciklus nem a Main-ben, hanem ebben a külön metódusban található.

            // 3. PÉLDA – ÉRTÉKET VISSZAADÓ METÓDUS.
            int negyzet = Negyzet(6); // A Negyzet(6) meghívás visszaad egy int értéket; ezt a negyzet változóban tároljuk.
            Console.WriteLine($"6 négyzete: {negyzet}\n"); // Kiírjuk a METÓDUStől visszakapott értéket, majd egy üres sort kezdünk.

            // 4. PÉLDA – Random OBJEKTUM ÁTADÁSA EGY METÓDUSNEK.
            Random random = new Random(); // Létrehozunk egyetlen Random objektumot, amelyet a véletlenszámot készítő metódusnak is át tudunk adni.
            int veletlen = VeletlenSzam(random, 1, 11); // A metódusnak három argumentumot adunk át; a visszakapott véletlen egész számot eltároljuk.
            Console.WriteLine($"A METÓDUS által generált véletlen szám 1 és 10 között: {veletlen}\n"); // Kiírjuk a visszakapott véletlen számot.

            // 5. PÉLDA – NEM static METÓDUS MEGHÍVÁSA.
            Program program = new Program(); // Létrehozunk egy Program típusú objektumot, mert a nem static metódust nem hívhatjuk meg közvetlenül a static Main-ből.
            program.NemStatikusMetodus(); // A létrehozott program objektumon keresztül meghívjuk a nem static metódust.

            Console.WriteLine("\nA program visszaért a Main végére."); // Ez a sor csak az előző METÓDUShívások befejezése után hajtódik végre.
        } // Itt ér véget a Main metódus törzse.

        static void EgyszeruMetodus() // static: példány nélkül hívható; void: nem ad vissza értéket; a metódus neve EgyszeruMetodus; nincs paramétere.
        { // Itt kezdődik az EgyszeruMetodus() metódus törzse.
            Console.WriteLine("Most az EgyszeruMetodus() fut.\n"); // A metódus egyetlen feladata, hogy kiírja ezt a szöveget, majd a végén visszaadja a vezérlést a hívó kódrésznek.
        } // Itt ér véget az EgyszeruMetodus() metódus.

        static void SzamoljOtosig() // Ez is static void metódus: példány nélkül hívható, és nem ad vissza értéket.
        { // Itt kezdődik a SzamoljOtosig() metódus törzse.
            Console.WriteLine("Most a SzamoljOtosig() fut:"); // Jelezzük a konzolon, hogy melyik metódus végrehajtása kezdődött el.

            for (int i = 1; i <= 5; i++) // A ciklus i = 1-ről indul, 5-ig fut, és minden kör végén eggyel növeli i értékét.
            { // Itt kezdődik a for ciklus törzse.
                Console.Write($"{i} "); // Kiírjuk az i aktuális értékét ugyanabba a sorba.
            } // Itt ér véget a for ciklus törzse; ha a feltétel még igaz, következik a következő ismétlés.

            Console.WriteLine("\n"); // A számsor után új sort és még egy üres sort írunk.
        } // Itt ér véget a SzamoljOtosig() metódus; a program visszatér ahhoz a sorhoz, ahonnan meghívtuk.

        static int Negyzet(int szam) // A metódus egy int típusú szam paramétert kap, és a void helyett int szerepel, ezért int értéket kell visszaadnia.
        { // Itt kezdődik a Negyzet() metódus törzse.
            int eredmeny = szam * szam; // A paraméterként kapott számot megszorozzuk önmagával, és az eredményt egy helyi változóban tároljuk.
            return eredmeny; // A return visszaadja az eredmeny értékét annak a kódrésznek, amely meghívta a Negyzet() metódust.
        } // Itt ér véget a Negyzet() metódus.

        static int VeletlenSzam(Random random, int minimum, int maximum) // Három paramétert várunk: egy Random objektumot és két int határértéket; a metódus int értéket ad vissza.
        { // Itt kezdődik a VeletlenSzam() metódus törzse.
            int szam = random.Next(minimum, maximum); // A Next() a minimumot még engedi, a maximumot már nem; például 1 és 11 esetén 1..10 lehet az eredmény.
            return szam; // Visszaadjuk a létrehozott véletlen egész számot a hívó kódrésznek.
        } // Itt ér véget a VeletlenSzam() metódus.

        void NemStatikusMetodus() // Ez a metódus NEM static; void, tehát nem ad vissza értéket, de a meghívásához szükség van egy Program objektumra.
        { // Itt kezdődik a NemStatikusMetodus() metódus törzse.
            Console.WriteLine("Most a NemStatikusMetodus() fut."); // Kiírjuk, hogy sikeresen meghívtuk a Program egyik példányához tartozó metódust.
        } // Itt ér véget a NemStatikusMetodus() metódus.
    } // Itt ér véget a Program osztály törzse.
} // Itt ér véget a _09_Metodusek névtér.


/*
 * METÓDUS VAGY METÓDUS?
 * ----------------------
 *
 * A hétköznapi programozási szóhasználatban gyakran egyszerűen
 * "METÓDUSnek" nevezzük az olyan különálló kódrészleteket, amelyeket
 * név alapján meg lehet hívni.
 *
 * C#-ban azonban az osztályon belül létrehozott ilyen METÓDUSek pontosabb
 * neve: METÓDUS.
 *
 * Ebben a programban például:
 *
 *     static void EgyszeruMetodus()
 *
 * technikailag egy metódus, mert a Program osztályhoz tartozik.
 *
 * A tananyagban a "METÓDUS" és a "metódus" szót az elején nyugodtan
 * használhatjuk egymás mellett, de érdemes tudni, hogy C#-ban a metódus
 * a pontosabb megnevezés.
 *
 * Már eddig is rengeteg metódust használtunk:
 *
 *     Console.WriteLine()
 *     Console.ReadLine()
 *     int.Parse()
 *     random.Next()
 *     Math.Round()
 *
 * A különbség most az, hogy már nemcsak mások által elkészített
 * metódusokat használunk, hanem SAJÁT metódusokat is készítünk.
 */


/*
 * MIÉRT HASZNÁLUNK METÓDUSEKET / METÓDUSOKAT?
 * ---------------------------------------------
 *
 * Egy program minden utasítását beleírhatnánk a Main() metódusba is.
 * Kis programnál ez még működhet, de hamar áttekinthetetlenné válna.
 *
 * A metódusok segítségével a programot kisebb, névvel ellátott
 * feladatokra bonthatjuk.
 *
 * Például ahelyett, hogy a Main-ben lenne egy hosszabb számláló ciklus:
 *
 *     for (int i = 1; i <= 5; i++)
 *     {
 *         Console.Write($"{i} ");
 *     }
 *
 * készíthetünk egy külön metódust:
 *
 *     static void SzamoljOtosig()
 *     {
 *         for (int i = 1; i <= 5; i++)
 *         {
 *             Console.Write($"{i} ");
 *         }
 *     }
 *
 * és a Main-ben már csak ezt írjuk:
 *
 *     SzamoljOtosig();
 *
 * Előnyei:
 *
 *     - a Main rövidebb és áttekinthetőbb lesz;
 *     - a feladatnak beszédes nevet adhatunk;
 *     - ugyanazt a metódust többször is meghívhatjuk;
 *     - a programot kisebb részekre tudjuk bontani;
 *     - a hibákat is könnyebb lehet megtalálni.
 */


/*
 * EGY EGYSZERŰ METÓDUS FELÉPÍTÉSE
 * -------------------------------
 *
 * Nézzük ezt:
 *
 *     static void EgyszeruMetodus()
 *     {
 *         Console.WriteLine("Most az EgyszeruMetodus() fut.");
 *     }
 *
 * A fejléc felépítése:
 *
 *     static      void      EgyszeruMetodus      ()
 *       ↓           ↓               ↓              ↓
 *    módosító    visszatérési     metódus        paraméterek
 *                  típus            neve
 *
 * Kezdőként ebből most négy dolgot érdemes felismerni:
 *
 * 1. static
 *    A metódus közvetlenül a Program osztályhoz tartozik.
 *    A static Main-ből ezért közvetlenül meghívható.
 *
 * 2. void
 *    A metódus nem ad vissza értéket.
 *
 * 3. EgyszeruMetodus
 *    Ez a metódus neve.
 *
 * 4. ()
 *    A zárójelben lennének a paraméterek.
 *    Itt üres, tehát ez a metódus nem vár bemenő adatot.
 *
 * A { } kapcsos zárójelek között található a metódus törzse,
 * vagyis azok az utasítások, amelyek a meghívásakor lefutnak.
 */


/*
 * DEKLARÁCIÓ ÉS MEGHÍVÁS NEM UGYANAZ
 * ----------------------------------
 *
 * Amikor ezt leírjuk:
 *
 *     static void EgyszeruMetodus()
 *     {
 *         Console.WriteLine("Most az EgyszeruMetodus() fut.");
 *     }
 *
 * akkor LÉTREHOZZUK, vagyis deklaráljuk/definiáljuk a metódust.
 *
 * Ettől még nem feltétlenül fut le.
 *
 * A futtatásához meg kell hívni:
 *
 *     EgyszeruMetodus();
 *
 * A meghíváskor a program:
 *
 *     1. eljut az EgyszeruMetodus(); sorhoz;
 *     2. átugrik az EgyszeruMetodus() törzséhez;
 *     3. végrehajtja az ott lévő utasításokat;
 *     4. a metódus végén visszatér a hívás utáni következő sorhoz.
 *
 * Fontos tehát:
 *
 *     static void EgyszeruMetodus()   -> a metódus létrehozása
 *
 *     EgyszeruMetodus();              -> a metódus meghívása
 */


/*
 * void – AMIKOR A METÓDUS NEM AD VISSZA ÉRTÉKET
 * ---------------------------------------------
 *
 * A void jelentése leegyszerűsítve:
 *
 *     "ez a metódus nem ad vissza értéket"
 *
 * Például:
 *
 *     static void EgyszeruMetodus()
 *
 * A metódus kiír valamit a képernyőre, tehát CSINÁL valamit,
 * de a meghívó kódrésznek nem ad vissza egy felhasználható értéket.
 *
 * Ezért ezt egyszerűen meghívjuk:
 *
 *     EgyszeruMetodus();
 *
 * de ilyet nem írunk:
 *
 *     int x = EgyszeruMetodus();
 *
 * mert nincs int vagy más érték, amit el lehetne tárolni.
 *
 * A Main is void ebben a programban:
 *
 *     static void Main(string[] args)
 *
 * tehát az eddig minden programban látott "void" ugyanazt jelenti.
 */


/*
 * NEM void – AMIKOR A METÓDUS ÉRTÉKET AD VISSZA
 * ---------------------------------------------
 *
 * Nézzük a Negyzet() metódust:
 *
 *     static int Negyzet(int szam)
 *     {
 *         int eredmeny = szam * szam;
 *         return eredmeny;
 *     }
 *
 * Itt a void helyén int áll:
 *
 *     static INT Negyzet(...)
 *
 * Ez azt jelenti, hogy a metódus egy int típusú értéket ad vissza.
 *
 * Ezért a metódus törzsében szerepel:
 *
 *     return eredmeny;
 *
 * A return szó szerint visszaadja az értéket a hívás helyére.
 *
 * Ha ezt írjuk:
 *
 *     int negyzet = Negyzet(6);
 *
 * akkor a történés leegyszerűsítve:
 *
 *     Negyzet(6)
 *         ↓
 *     6 * 6
 *         ↓
 *     return 36
 *         ↓
 *     int negyzet = 36;
 *
 * Vagyis a metódushívást szinte úgy képzelhetjük el,
 * mintha a végén a visszaadott érték kerülne a helyére.
 */


/*
 * A return UTASÍTÁS
 * -----------------
 *
 * A return egy értéket visszaadó metódus egyik legfontosabb eleme.
 *
 * Például:
 *
 *     static int Negyzet(int szam)
 *     {
 *         return szam * szam;
 *     }
 *
 * Ez rövidebb változata lenne a programban használt megoldásnak:
 *
 *     static int Negyzet(int szam)
 *     {
 *         int eredmeny = szam * szam;
 *         return eredmeny;
 *     }
 *
 * A kettő eredménye ugyanaz.
 *
 * Az int visszatérési típus miatt a metódusnak int értéket kell
 * visszaadnia.
 *
 * Például ez hibás lenne:
 *
 *     static int Negyzet(int szam)
 *     {
 *         return "harminchat";
 *     }
 *
 * mert a "harminchat" string, miközben a metódus int visszatérési
 * típust ígért.
 */


/*
 * PARAMÉTER ÉS ARGUMENTUM
 * ----------------------
 *
 * A metódusnak adatot is átadhatunk.
 *
 * Például a deklarációban:
 *
 *     static int Negyzet(int szam)
 *
 * az:
 *
 *     int szam
 *
 * egy PARAMÉTER.
 *
 * A felépítése:
 *
 *     int      szam
 *      ↓         ↓
 *    típus    paraméter neve
 *
 * Amikor meghívjuk:
 *
 *     Negyzet(6)
 *
 * akkor a 6 az ARGUMENTUM, vagyis a híváskor ténylegesen átadott érték.
 *
 * Kezdőként elég ezt így megjegyezni:
 *
 *     paraméter  -> a metódus deklarációjában szereplő változó
 *     argumentum -> a meghíváskor átadott konkrét érték
 *
 * A metóduson belül a szam változó értéke ebben a hívásban 6 lesz.
 */


/*
 * TÖBB PARAMÉTER
 * --------------
 *
 * Egy metódus több adatot is kaphat.
 *
 * A programban:
 *
 *     static int VeletlenSzam(Random random, int minimum, int maximum)
 *
 * három paraméter található:
 *
 *     Random random
 *     int minimum
 *     int maximum
 *
 * Ezeket vessző választja el egymástól.
 *
 * A meghívás:
 *
 *     VeletlenSzam(random, 1, 11)
 *
 * Itt a három argumentum sorrendben bekerül a három paraméterbe:
 *
 *     random  -> random
 *     1       -> minimum
 *     11      -> maximum
 *
 * Ezután a metóduson belül:
 *
 *     random.Next(minimum, maximum)
 *
 * valójában ugyanúgy működik, mintha ezt írtuk volna:
 *
 *     random.Next(1, 11)
 *
 * A Next() felső határa kizárólagos, ezért az eredmény 1 és 10
 * közötti egész szám lehet.
 */


/*
 * static – MIT JELENT ITT?
 * ------------------------
 *
 * A Main fejlécében ezt már a legelső C# program óta látjuk:
 *
 *     static void Main(string[] args)
 *
 * Most azért válik igazán fontossá, mert saját metódusokat készítünk.
 *
 * Egy static metódus az osztályhoz tartozik, nem egy konkrét
 * létrehozott objektumhoz.
 *
 * Ezért a static Main-ből egy másik static metódust egyszerűen
 * meghívhatunk:
 *
 *     EgyszeruMetodus();
 *     SzamoljOtosig();
 *     Negyzet(6);
 *
 * Nem kell előtte Program objektumot létrehoznunk.
 *
 * Kezdő konzolos programoknál emiatt gyakran static metódusokkal
 * találkozunk először.
 */


/*
 * NEM static METÓDUS
 * ------------------
 *
 * A program végén ez szerepel:
 *
 *     void NemStatikusMetodus()
 *     {
 *         Console.WriteLine("Most a NemStatikusMetodus() fut.");
 *     }
 *
 * Nincs előtte static.
 *
 * Ezért ez a metódus egy Program PÉLDÁNYHOZ, vagyis egy létrehozott
 * Program objektumhoz tartozik.
 *
 * A Main viszont static, ezért innen nem írhatjuk egyszerűen ezt:
 *
 *     NemStatikusMetodus();
 *
 * Ehhez előbb létrehozunk egy Program objektumot:
 *
 *     Program program = new Program();
 *
 * majd azon keresztül hívjuk a metódust:
 *
 *     program.NemStatikusMetodus();
 *
 * A felépítés ismerős lehet a Random témából:
 *
 *     Random random = new Random();
 *     random.Next(...);
 *
 * Ott is létrehoztunk egy objektumot, majd azon hívtunk meg egy
 * nem static metódust.
 *
 * Ezen a ponton ennél mélyebben még nem szükséges belemenni az
 * objektumok és példányok működésébe. Később, az osztályoknál
 * ez sokkal részletesebben elő fog kerülni.
 */


/*
 * static ÉS NEM static – EGYMÁS MELLETT
 * -------------------------------------
 *
 * static metódus:
 *
 *     static void EgyszeruMetodus()
 *
 * Meghívása a static Main-ből:
 *
 *     EgyszeruMetodus();
 *
 *
 * nem static metódus:
 *
 *     void NemStatikusMetodus()
 *
 * Meghívása a static Main-ből:
 *
 *     Program program = new Program();
 *     program.NemStatikusMetodus();
 *
 * Kezdőként tehát a legfontosabb gyakorlati különbség:
 *
 *     static      -> itt közvetlenül meghívható
 *     nem static  -> példányon/objektumon keresztül hívjuk
 */


/*
 * METÓDUS ÉS for CIKLUS
 * ----------------------
 *
 * Egy metódus törzsében ugyanazokat a nyelvi elemeket használhatjuk,
 * amelyeket már a Main-ben is használtunk.
 *
 * Például lehet benne for ciklus:
 *
 *     static void SzamoljOtosig()
 *     {
 *         for (int i = 1; i <= 5; i++)
 *         {
 *             Console.Write($"{i} ");
 *         }
 *     }
 *
 * A for működése semmit nem változik attól, hogy külön metódusba került.
 *
 * A metódus egyszerűen egy névvel ellátott kódblokk, amelyben
 * ugyanúgy lehet:
 *
 *     - változó;
 *     - if;
 *     - switch;
 *     - for;
 *     - Random használat;
 *     - Console.WriteLine();
 *     - másik metódus meghívása;
 *
 * és később sok minden más is.
 */


/*
 * METÓDUS ÉS Random
 * ------------------
 *
 * A Main-ben egyszer létrehozzuk:
 *
 *     Random random = new Random();
 *
 * Ezután ezt az objektumot átadjuk a saját metódusunknak:
 *
 *     int veletlen = VeletlenSzam(random, 1, 11);
 *
 * A metódus:
 *
 *     static int VeletlenSzam(Random random, int minimum, int maximum)
 *     {
 *         int szam = random.Next(minimum, maximum);
 *         return szam;
 *     }
 *
 * Ebben egyszerre több korábbi ismeret kapcsolódik össze:
 *
 *     - Random objektum;
 *     - Next();
 *     - paraméterek;
 *     - int típus;
 *     - helyi változó;
 *     - return;
 *     - visszatérési érték.
 *
 * Fontos, hogy itt sem készítünk minden hívásnál új Random objektumot.
 * A Main-ben létrehozott egyetlen objektumot adjuk tovább a metódusnak.
 */


/*
 * A METÓDUSOK HELYE A Program OSZTÁLYBAN
 * --------------------------------------
 *
 * Ebben a tananyagban a saját metódusainkat a Program osztályon belül,
 * de a Main metóduson KÍVÜL hozzuk létre:
 *
 *     internal class Program
 *     {
 *         static void Main(string[] args)
 *         {
 *             EgyszeruMetodus();
 *         }
 *
 *         static void EgyszeruMetodus()
 *         {
 *             Console.WriteLine("Hello!");
 *         }
 *     }
 *
 * Vagyis a kapcsos zárójelek szintje nagyon fontos.
 *
 * A saját metódusunk:
 *
 *     - nincs a Main { } blokkján belül;
 *     - viszont még mindig a Program osztály { } blokkján belül van.
 *
 * A C# egyébként ismer úgynevezett helyi METÓDUSeket is, amelyeket
 * másik metódus belsejében lehet létrehozni, de EZ MOST NEM TÉMÁNK.
 * Az első lépésben maradunk a Program osztály közvetlen metódusainál.
 */


/*
 * A METÓDUSOK SORRENDJE A FÁJLBAN
 * -------------------------------
 *
 * A programban előbb található a Main, és csak alatta vannak a saját
 * metódusaink:
 *
 *     Main(...)
 *     EgyszeruMetodus()
 *     SzamoljOtosig()
 *     Negyzet(...)
 *     VeletlenSzam(...)
 *     NemStatikusMetodus()
 *
 * Ettől a Main még nyugodtan meghívhatja őket.
 *
 * A C# fordító nem úgy olvassa a fájlt, mint mi egy receptet, hogy
 * csak azt ismerheti, ami már korábban szerepelt a szövegben.
 * A Program osztály metódusait a fordítás során együtt kezeli.
 *
 * Ezért teljesen természetes, hogy a Main-ben ezt látjuk:
 *
 *     EgyszeruMetodus();
 *
 * miközben maga az EgyszeruMetodus() deklarációja csak néhány sorral
 * később található.
 */


/*
 * HATÓKÖR A METÓDUSOKBAN
 * ----------------------
 *
 * A metódusban létrehozott helyi változók csak az adott metódus
 * megfelelő blokkjában használhatók.
 *
 * Például:
 *
 *     static int Negyzet(int szam)
 *     {
 *         int eredmeny = szam * szam;
 *         return eredmeny;
 *     }
 *
 * Az eredmeny változó a Negyzet() helyi változója.
 *
 * A Main-ben nem írhatnánk ezt:
 *
 *     Console.WriteLine(eredmeny);
 *
 * mert ott az eredmeny változó nem létezik.
 *
 * A visszaadott ÉRTÉKET viszont átvehetjük egy másik változóba:
 *
 *     int negyzet = Negyzet(6);
 *
 * Itt a negyzet már a Main saját helyi változója.
 */


/*
 * A METÓDUS NEVE
 * ---------------
 *
 * A metódusnak érdemes olyan nevet adni, amelyből kiderül, mit csinál.
 *
 * Példák:
 *
 *     Negyzet()
 *     VeletlenSzam()
 *     SzamoljOtosig()
 *
 * kevésbé jó nevek lennének:
 *
 *     Metodus1()
 *     Valami()
 *     X()
 *
 * C#-ban a metódusneveknél a szokásos elnevezési forma a PascalCase:
 * minden szó nagy kezdőbetűvel indul.
 *
 * Például:
 *
 *     SzamoljOtosig
 *     VeletlenSzam
 *     KeruletSzamitas
 *
 * A fordító nem azért fogadja el ezeket, mert PascalCase alakúak;
 * ez elsősorban elnevezési szokás, amely olvashatóbbá teszi a kódot.
 */


/*
 * NÉGY EGYSZERŰ ESET, AMIT MOST FEL KELL ISMERNI
 * ---------------------------------------------
 *
 * 1. static + void
 *
 *     static void EgyszeruMetodus()
 *
 *     -> példány nélkül hívható
 *     -> nem ad vissza értéket
 *
 *
 * 2. static + nem void
 *
 *     static int Negyzet(int szam)
 *
 *     -> példány nélkül hívható
 *     -> int értéket ad vissza
 *
 *
 * 3. nem static + void
 *
 *     void NemStatikusMetodus()
 *
 *     -> Program objektumon keresztül hívjuk
 *     -> nem ad vissza értéket
 *
 *
 * 4. nem static + nem void
 *
 *     Ilyet ez az első példa szándékosan nem használ.
 *
 *     Természetesen ilyen is létezik, például:
 *
 *         int ValamilyenSzamitas()
 *
 *     de az első órán fontosabb a static/nem static és a
 *     void/visszatérési típus alapötletének megértése, mint az összes
 *     kombináció külön kipróbálása.
 */


/*
 * A PROGRAM FUTÁSA LÉPÉSEKBEN
 * ---------------------------
 *
 * A program indulásakor a Main() fut.
 *
 * 1. Kiírjuk:
 *
 *        A program elindult.
 *
 * 2. Meghívjuk:
 *
 *        EgyszeruMetodus();
 *
 *    A program átmegy a metódusba, kiírja a szöveget, majd visszatér.
 *
 * 3. Meghívjuk:
 *
 *        SzamoljOtosig();
 *
 *    A metódusban lefut a for ciklus.
 *
 * 4. Meghívjuk:
 *
 *        Negyzet(6)
 *
 *    A metódus 36-ot ad vissza, amely bekerül a negyzet változóba.
 *
 * 5. Létrehozunk egy Random objektumot, majd meghívjuk:
 *
 *        VeletlenSzam(random, 1, 11)
 *
 *    A metódus visszaad egy 1 és 10 közötti egész számot.
 *
 * 6. Létrehozunk egy Program objektumot:
 *
 *        Program program = new Program();
 *
 *    majd azon keresztül meghívjuk:
 *
 *        program.NemStatikusMetodus();
 *
 * 7. A program visszatér a Main végére és befejeződik.
 */


/*
 * A LEGFONTOSABB ÚJ FOGALMAK RÖVIDEN
 * ----------------------------------
 *
 * METÓDUS
 *     Névvel ellátott kódrészlet, amelyet meg lehet hívni.
 *
 * MEGHÍVÁS
 *     A metódus futtatása, például:
 *
 *         EgyszeruMetodus();
 *
 * void
 *     A metódus nem ad vissza értéket.
 *
 * VISSZATÉRÉSI TÍPUS
 *     Megmondja, milyen típusú értéket ad vissza a metódus.
 *     Például az int azt jelenti, hogy egész számot ad vissza.
 *
 * return
 *     Visszaad egy értéket a hívó kódrésznek.
 *
 * PARAMÉTER
 *     A metódus deklarációjában megadott bemenő változó.
 *
 * ARGUMENTUM
 *     A meghíváskor ténylegesen átadott érték.
 *
 * static
 *     A metódus az osztályhoz tartozik, és itt példány nélkül hívható.
 *
 * nem static
 *     A metódust egy létrehozott objektumon/példányon keresztül hívjuk.
 */


/*
 * MIT ÉRDEMES EBBŐL ELSŐRE TUDNI?
 * -------------------------------
 *
 * Első körben nem az a cél, hogy a C# metódusainak minden lehetőségét
 * ismerjük.
 *
 * Ha ezt a néhány dolgot biztosan felismerjük, már jó alapunk van:
 *
 *     1. A metódus egy külön névvel ellátott kódrészlet.
 *
 *     2. A metódust a neve és a () segítségével hívjuk meg:
 *
 *            EgyszeruMetodus();
 *
 *     3. A void azt jelenti, hogy nincs visszaadott érték.
 *
 *     4. Az int, double, string stb. a void helyén azt jelenti,
 *        hogy a metódus ilyen típusú értéket ad vissza.
 *
 *     5. Az értéket a return adhatja vissza.
 *
 *     6. A zárójelben paramétereket adhatunk meg:
 *
 *            Negyzet(int szam)
 *
 *     7. A static metódust a static Main-ből közvetlenül meghívhatjuk.
 *
 *     8. A nem static metódushoz ebben a példában Program objektumot
 *        hoztunk létre.
 *
 *     9. Egy metódusban ugyanúgy használhatjuk a korábban tanult
 *        elemeket, például for ciklust és Random objektumot.
 *
 * Ezekre később lehet építeni a bonyolultabb témákat: többféle
 * visszatérési érték, összetettebb paraméterezés, túlterhelés,
 * rekurzió, osztályok és objektumorientált programozás.
 * Ezeket azonban ennél az első METÓDUSes anyagnál még nem szükséges
 * egyszerre a diákokra zúdítani.
 */