Často se stane, že náš program má udělat nějakou ucelenou část (několik souvisejících kroků), potom něco jiného, potom znovu tu stejnou část, pak zase něco dalšího a pak třeba ještě jednou tutéž ucelenou část.
Na výše uvedený případ nelze použít cyklus, protože mezi opakováním kusu kódu se provádějí jiné části programu. Rozkopírovat stejný kód (nebo i podobný, lišící se např. jen v nějakém "parametru", třeba v tom, že jednou něco počítáme pro všední den, a podruhé pro sobotu nebo neděli) na více míst v programu je tzv. bad practice, něco, co bychom dělat neměli.
V takové situaci můžeme použít volání podprogramu. Část kódu, která se opakuje, dáme na jedno místo, vhodným způsobem ho pojmenujeme a na ostatní místa, kam bychom jinak kód museli zkopírovat, dáme místo toho pouze odkaz (to jméno našeho "podprogramu"). Když to, co náš program provádí, narazí na tento odkaz, "zavolá" podprogram, ten se vykoná a potom se řízení vrátí opět na místo, odkud jsme podprogram zavolali.
V C# (a obecně v objektově-orientovaných jazycích) se podprogramu říká metoda. Pokud potřebujeme metodě z místa, odkud ji voláme, předat nějaká data, použijeme k tomu účelu parametry. Parametry píšeme za název metody jako seznam v kulatých závorkách. Tam, kde je metoda definovaná, uvedeme v seznamu parametrů i jejich datové typy. Jedná se o tzv. formální parametry. Tam, odkud metodu voláme, uvedeme pouze hodnoty, které chceme do formálních parametrů předat. Předávaným hodnotám říkáme skutečné parametry, někdy též argumenty.
Pokud metoda předává nějakou hodnotu zpět na místo, odkud jsme ji zavolali, říkáme, že tuto hodnotu vrací ("return") a taková metoda se v terminologii procedurálního programování nazývá funkce.
Pokud se z metody vrátí řízení na místo, odkud jsme ji zavolali, a žádná data se zpět z metody volajícímu nevrací, říkáme takové metodě procedura.
Příklad procedury, která vždy vhodným způsobem "odřádkuje" (vynechá ve výpisu několik prázdných řádků).
public class Program { public static void Main(string[] args) { Console.WriteLine("Pohádka o perníkové chaloupce"); MakeEmptyLines(3); Console.WriteLine("Bylo nebylo, za dávných časů žili na kraji lesa tatínek s maminkou. Měli dvě děti.") Console.WriteLine("Jedno z dětí byl chlapeček a jmenoval se Jan. Říkali mu Jeníček.") Console.WriteLine("Druhé dítě bylo děvčátko, Marie. Pro tatínka s maminkou však vždycky Mařenka.") MakeEmptyLines(1); Console.WriteLine("Tatínek se živil prací v lese. Byl dřevorubec. Kácel stromy.") Console.WriteLine("Jednou vzal tatínek Jeníčka a Mařenku s sebou do práce. Musel jít daleko, až na druhou stranu jejich lesa.") MakeEmptyLines(1); // ... } private static void MakeEmptyLines(int count) { for (int i = 0; i < count; i++) { Console.WriteLine(); } } }