Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 1 · Урок 8

Методи (функции)

Декомпозиция на код в методи — параметри, връщана стойност, претоварване, локални променливи и обхват.

Защо ни трябват методи

Когато програмата стане по-голяма, същият код започва да се повтаря на много места. Методите (в други езици — „функции") ни позволяват да опаковаме парче код, да му дадем име и да го извикваме колкото пъти искаме.

Ключово

Метод = именован блок код, който може да приема параметри и да връща резултат.

Анатомия на метод

модификатори  тип-резултат  име(параметри)
{
    // тяло
    return стойност;   // ако typеът не е void
}

Класически пример:

static int Square(int x)
{
    return x * x;
}

// извикване:
int result = Square(5);   // 25
  • static — за сега го пиши винаги (ще обясним във ООП).
  • int — този метод връща цяло число.
  • Square — име на метода (PascalCase по конвенция).
  • (int x) — един параметър x от тип int.
  • return x * x; — какво връщаме.

void — методи без връщан резултат

Ако методът просто „прави нещо" (без да трябва да върне стойност), типът е void:

static void Greet(string name)
{
    Console.WriteLine($"Здравей, {name}!");
}

Greet("Мария");   // Здравей, Мария!

Параметри

Няколко параметъра

static int Max(int a, int b)
{
    return a > b ? a : b;
}

int m = Max(7, 12);   // 12

Стойности по подразбиране

static void Greet(string name = "приятел")
{
    Console.WriteLine($"Здравей, {name}!");
}

Greet();           // Здравей, приятел!
Greet("Иван");     // Здравей, Иван!

Претоварване (overloading)

Може да имаш няколко метода с едно и също име, стига да се различават по броя или типа на параметрите:

static int Add(int a, int b) => a + b;
static double Add(double a, double b) => a + b;
static int Add(int a, int b, int c) => a + b + c;

Add(2, 3);          // 5     — първият
Add(2.5, 3.5);      // 6.0   — вторият
Add(1, 2, 3);       // 6     — третият

Бележка

Това е удобно когато правиш сходни операции с различни типове. Не злоупотребявай — много претоварвания затрудняват четенето.

Обхват на променливите

Променлива, обявена вътре в метод, съществува само в този метод. Извън него — все едно я няма.

static void DoSomething()
{
    int local = 42;
    Console.WriteLine(local);
}

static void Main()
{
    DoSomething();
    // Console.WriteLine(local);  // ❌ грешка — local не е видима тук
}

Стек на извикванията

Когато извикаш метод, текущото място в кода се „запомня" в стек, и изпълнението скача в новия метод. Когато той приключи, се връща назад.

static int Square(int x) => x * x;
static int SumOfSquares(int a, int b) => Square(a) + Square(b);

static void Main()
{
    Console.WriteLine(SumOfSquares(3, 4));   // 9 + 16 = 25
}

Кога да изваждаш в метод

  • Когато същия код го пишеш на две или повече места.
  • Когато едно действие може да се опише с име (напр. „валидирай вход", „форматирай дата").
  • Когато един метод е станал твърде дълъг и труден за четене.

Едно действие — един метод

Добрият метод прави едно ясно нещо, описано от името му. Ако трябва да обясняваш дълго какво прави — раздели го.

Какво трябва да запомниш

  • Метод = именован блок код с параметри и (евентуално) връщана стойност.
  • void = не връща нищо; иначе указваш типа.
  • Параметрите са локални за метода — извън него не съществуват.
  • Може да имаш няколко метода с едно име (overloading) с различни параметри.
  • Извличай в метод, когато: повтаряш код, ясна задача с име, или методът е станал твърде дълъг.