1. Функции/Методы в C#
Вы уже выучили большое количество команд в C#, а значит вы можете писать достаточно сложные программы. 10, 20, 30 строк кода в программе — не такая и большая программа, верно?
А вот программа в 100+ строк — уже большая, и разбираться в ее коде довольно сложно. Можно ли как-то упростить написание и чтение программ с большим количеством кода?
Да, и помогут нам в этом методы (функции).
Что же такое метод? Если очень сильно упростить, то метод — это группа команд, у которой есть уникальное имя. Другими словами, мы просто компонуем несколько команд в одну группу и даем ей уникальное имя. И все — метод готов.
Допустим у вас есть код для рисования кота:
Console.WriteLine(" |\\__/,| (`\\");
Console.WriteLine(" |o_o |__ _) )");
Console.WriteLine(" (____/ (_/ ");
Вот что он выводит:
|\__/,| (`\
|o_o |__ _) )
(____/ (_/
Вы можете просто перенести его в отдельный метод и рисовать сколько угодно котов:
void WriteCat()
{
Console.WriteLine(" |\\__/,| (`\\");
Console.WriteLine(" |o_o |__ _) )");
Console.WriteLine(" (____/ (_/ ");
}
//рисуем трех котов
WriteCat();
WriteCat();
WriteCat();
Когда программа запущена, каждый раз при выполнении команды WriteCat() она будет выполнять все команды внутри метода WriteCat(). Мы просто создали новую команду (метод), объединив в одну группу несколько команд.
В чём смысл функций:
- Делят программу на части, каждая из которых занимается своей задачей.
- Упрощают повторное использование: один раз написали, используем сколько угодно раз.
- Снижают вероятность ошибок: баг в функции правим в одном месте.
- Дают коду "имена" для сложных действий — читаемость резко растёт.
Терминология: функция, метод, процедура
В C# термин функция и метод обычно означают одно и то же, но есть небольшие нюансы.
- Метод — функция, принадлежащая классу или объекту (в C# почти всё — методы).
- Процедура — функция, которая не возвращает значение (void-методы).
- Функция — в широком смысле любая именованная часть программы, которую можно вызвать.
Официально в C# всё это называется методами, но если случайно где-то дальше встретите "функцию" — не пугайтесь!
2. Синтаксис объявления метода: разбор по полочкам
Давайте разберём простейшую функцию, классическую "Hello, World!", только вынесем её вывод в отдельный метод:
using System;
class Program
{
static void Main()
{
PrintHello();
}
static void PrintHello() // выводим текст Hello, World!
{
Console.WriteLine("Hello, World!");
}
}
Разбор синтаксиса:
| Часть | Пример | Описание |
|---|---|---|
| Модификатор | |
Указывает, что метод принадлежит классу (подробнее — позже) |
| Тип возвращаемого значения | |
Указывает, что метод ничего не возвращает |
| Имя метода | |
Имя метода, по которому его вызывают |
| Параметры | |
Аргументы (пусто — нет аргументов) |
| Тело метода | |
Код, выполняемый при вызове метода |
Аналогия:
Метод можно представить как кофейный автомат: вы кладёте деньги (аргументы), нажимаете кнопку (вызываете метод), автомат варит кофе (тело метода), и выдаёт результат (возвращаемое значение) — или не выдаёт, если это void-метод!
3. Как вызывать методы
Вызов метода — это просто его имя и круглые скобки и все:
PrintHello(); // Метод без параметров
int sum = Add(2, 3); // Метод с параметрами и результатом
Важно: вызывать метод можно только после его объявления (или если оно находится "выше" по коду, либо находится в том же классе).
4. Методы с параметрами
В метод можно передавать параметры. Это делает поведение метода гибким и кастомизируем под все случаи. Фактически параметры — это переменные метода, которым присваиваются значения в момент вызова метода. Параметры нужно указывать во время создания метода.
static void Greet(string name)
{
Console.WriteLine($"Привет, {name}!");
}
// Использование:
Greet("Алиса");
Greet("Боб");
Параметры — это переменные, значения которых вы передаёте методу при вызове.
| Часть | Пример | Описание |
|---|---|---|
| Тип параметра | |
Тип принимаемого значения |
| Имя параметра | |
Имя для использования в методе |
Вызовы:
Greet("Алиса"); — name получает значение "Алиса".
Несколько параметров
Можно объявить несколько параметров через запятую:
static void PrintSum(int a, int b)
{
Console.WriteLine($"Сумма: {a + b}");
}
// Использование:
PrintSum(5, 7); // Сумма: 12
5. Параметры-значения и параметры-ссылки
Параметры функции — это обычные переменные, и к ним применяются те же правила, что и к другим переменным.
Поэтому помните: когда вы передаёте в метод массив, вы передаёте ссылку на массив, то есть метод может изменить содержимое массива. Для простых типов (int, double), копируется значение.
static void ZeroFirstGrade(int[] grades)
{
grades[0] = 0; // Меняет исходный массив!
}
// Использование:
int[] a = {1, 2, 3, 4, 5};
ZeroFirstGrade(a);
Console.WriteLine(a[0]); //выведет 0
Фактически тут происходит вот что:
static void ZeroFirstGrade(int[] grades)
{
grades[0] = 0; // Меняет исходный массив!
}
// Использование:
int[] a = {1, 2, 3, 4, 5};
//ZeroFirstGrade(a);
int[] grades = a;
grades[0] = 0;
Console.WriteLine(a[0]); //выведет 0
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ