csharp.aspone.cz csharp.aspone.cz

Metoda, která vypočte hodnotu

Zde pozor! Zde je deklarace metody klíčovým slovem static (jde o statickou metodu, kterou můžeme volat, i když neexistuje žádná instance dané třídy). Dále následuje slovo int, které říká, že tato metoda vypočte a vrátí (return) celé číslo. Dvojmoc je identifikátor této metody.
Metoda Dvojmoc() má jeden formální parametr typu int, který se jmenuje n. Tento parametr představuje číslo, jehož druhou mocninu chceme spočítat.
Slovo return nám říká, že n * n je výsledek, který má metoda Dvojmoc() vrátit, tj. výsledek typu int.

using System;

class volani
{
    // static = statická metoda; int = návratová hodnota
    static int Dvojmoc(int n)
    {
        return n * n;
    }

    // hlavní funkce programu
    static void Main()
    {
        // do proměnné si uložíme hodnotu 12
        int n = 12;
        // a vypíšeme druhou mocninu čísla 12
        Console.WriteLine("Druhá mocnina čísla {0} je {1}", n, Dvojmoc(n));
        // zastavíme konzoli
        Console.ReadLine();
    }
 
}

Hlavička metody

static int Dvojmoc(int n); 

Tohle je deklarace metody Dvojmoc(), říká se mu hlavička metody a obsahuje všechny důležité informace pro její volání. Zde se například dozvíme, že tato metoda:
- se jmenuje Dvojmoc
- je statická (klíčové slovo static)
- vrací výsledek typu int
- a při volání ji musíme předat jeden skutečný parametr int

Další volání metod

Zde bych chtěl objasnit volání metody. V hlavičce vypocet je napsáno - přesněji v kulatých závorkách, že do metody proudí tři vstupy a to int s, int t, int u, těmto třem vstupům se říká parametry metody.
Ještě předtím je však před jménem metody napsáno int - co to je? No to znamená, že celková metoda vrací jen jeden výsledek a to typu int.
Takže to shrňme. Metoda vypocet() vrací int a vstupují do ní tři hodnoty int a ty jsem si pojmenoval. Pro mě bylo těžké pochopit, že jsem si je pojmenoval, ale můžu je volat s úplně jinými názvy proměnnými, jak jsem to demonstroval v metodě Main.

using System;

// a teď malý příklad
class volani
{
    // statická metoda vypocet
    static int vypocet(int s, int t, int u)
    {
        return (s * t) / u;
    }

    // hlavní metoda (vykonává se jako první)
    static void Main()
    {
        int x = 8;
        int u = 2;
        Console.WriteLine("Vypočtená hodnota je: {0}", vypocet(x, u, u));
        Console.ReadLine();
    }
}

V metodě Main jsem zavolal metodu vypocet s třemi reálnými parametry x u u. Proměnnou u jsem záměrně použil 2x. Takže tyto hodnoty 8 2 2.
No a jak jsem zavolal metodu výpočet tak se proměnné jakoby přeřadí, takže s = x, t = u, u = u. No a ty proměnné teď vstoupili do nějaký mašiny, tak se je nějak zpracuje a vydá výslednou hodnotu. Prostě je tam jen vytuní, přepočítá, upraví a vyplivně jednu hodnotu typu int.
Také si to můžeme představit tak, že je nějaká černá krabička, do které nevidíme. My do ní dáme nějaký vstup a ona nám vyplivne výstup.

Další prográmek na volání metod

No comment, na to už se musí přijít samo, je to jen pro zpestření. Rozdíl je v tom, že k metodě Triple nemůžeme přistupovat z jiných tříd (je privátní). K metodě Test můžeme přistupovat odkudkoliv (je public). A my implementujeme do této veřejné metody právě metody privátní.

public class Tester
{
    // privátní metoda Triple, která vrací int a má jeden parametr
    private int Triple(int val)
    {
        return 3 * val;
    }
    
    // privátní metoda Triple, která vrací long a má jeden parametr
    // říká se, že tato metoda je přetížená
    private long Triple(long val)
    {
        return 3 * val;
    }
    
    public void Test()
    {
        int x = 5;
        int y = Triple(x);
        System.Console.WriteLine("x = {0} y = {1}", x, y);

        long lx = 10;
        long ly = Triple(lx);
        System.Console.WriteLine("lx = {0} ly = {1}", lx, ly);
    }
    static void Main()
    {
        // zde jsme vytvořili instanci
        Tester t = new Tester(); 
        // přes instanci třídy mohu přistupovat k metodám (operátor tečka, v jiných prog. jazycích operátor ->)
        t.Test(); 
    }
}