- Определять метод с параметрами и вызывать его
- Возвращать результат через
returnи объяснять отличие от методовvoid - Использовать необязательные параметры и именованные аргументы
- Отличать передачу по значению от передачи через
refиout
Ты в пяти местах программы считаешь цену со скидкой и каждый раз копируешь одни и те же три строки. Потом находишь в формуле ошибку — и исправлять её приходится в пяти местах! Методы решают эту проблему: код пишется один раз, получает имя и вызывается сколько угодно раз. Console.WriteLine, int.Parse и string.Join — уже знакомые тебе методы, а теперь ты напишешь свои.
Определение и вызов метода
В заголовке метода сначала пишется тип возвращаемого значения, затем имя, а в скобках — параметры с их типами. void означает, что метод ничего не возвращает. В программе с операторами верхнего уровня методы обычно размещают в конце файла, но вызывать их можно и выше. Имена методов начинаются с заглавной буквы: Greet, CalculateTotal.
Greet("Aysel");
Greet("Murad");
void Greet(string name)
{
Console.WriteLine($"Salam, {name}!");
}Salam, Aysel! Salam, Murad!
Параметр — переменная, объявленная в заголовке метода (string name). Аргумент — конкретное значение, которое передаётся этому параметру при вызове ("Aysel").
return: возврат результата
Если метод возвращает результат, вместо void пишут тип результата, а в теле используют return. return завершает метод и отправляет значение в место вызова. Метод, тело которого состоит из одного выражения, можно кратко записать со стрелкой =>.
double area = RectangleArea(4, 3.5);
Console.WriteLine($"Room area: {area}");
Console.WriteLine(IsEven(10));
Console.WriteLine(CelsiusToFahrenheit(25));
double RectangleArea(double width, double height)
{
return width * height;
}
bool IsEven(int n) => n % 2 == 0;
double CelsiusToFahrenheit(double c) => c * 9 / 5 + 32;Room area: 14 True 77
Необязательные параметры и именованные аргументы
Параметру можно задать значение по умолчанию: если аргумент при вызове опущен, используется оно. Такие параметры пишут в конце списка. Аргументы можно передавать и по имени — discount: 10, тогда их порядок не важен, а смысл вызова сразу понятен.
Console.WriteLine(FinalPrice(80));
Console.WriteLine(FinalPrice(80, 25));
Console.WriteLine(FinalPrice(discount: 10, price: 50));
PrintTicket("Leyla");
PrintTicket("Elvin", seats: 3);
decimal FinalPrice(decimal price, int discount = 0)
{
return price - price * discount / 100;
}
void PrintTicket(string name, string city = "Baku", int seats = 1)
{
Console.WriteLine($"{name}: {seats} seat(s) in {city}");
}80 60 45 Leyla: 1 seat(s) in Baku Elvin: 3 seat(s) in Baku
seats: 3 передан по имени, параметр city удалось пропустить.Несколько результатов: кортежи, ref и out
Метод может вернуть сразу несколько значений в виде кортежа (tuple): тип результата пишется в скобках, например (int Min, int Max). При вызове кортеж можно сразу разложить на отдельные переменные:
int[] temperatures = [12, 5, 27, 9];
var (low, high) = MinMax(temperatures);
Console.WriteLine($"Min: {low}, max: {high}");
(int Min, int Max) MinMax(int[] numbers)
{
int min = numbers[0];
int max = numbers[0];
foreach (int n in numbers)
{
if (n < min) min = n;
if (n > max) max = n;
}
return (min, max);
}Min: 5, max: 27
По умолчанию аргументы передаются по значению: метод получает копию, и даже если меняет её, переменная у вызывающей стороны не меняется. Ключевое слово ref передаёт саму переменную — метод может её изменить. out служит для выдачи результатов: метод обязан записать значение в параметр out. И ref, и out пишутся и в заголовке метода, и при вызове.
int score = 10;
AddBonusCopy(score);
Console.WriteLine($"After copy: {score}");
AddBonus(ref score);
Console.WriteLine($"After ref: {score}");
Divide(17, 5, out int quotient, out int remainder);
Console.WriteLine($"17 / 5 = {quotient}, remainder {remainder}");
if (int.TryParse("42", out int number))
Console.WriteLine($"Parsed: {number}");
if (!int.TryParse("forty", out _))
Console.WriteLine("'forty' is not a number");
void AddBonusCopy(int value) => value += 5;
void AddBonus(ref int value) => value += 5;
void Divide(int x, int y, out int q, out int r)
{
q = x / y;
r = x % y;
}After copy: 10 After ref: 15 17 / 5 = 3, remainder 2 Parsed: 42 'forty' is not a number
AddBonusCopyизменил только копию, поэтомуscoreостался равен 10.- С
refметод получил саму переменную и сделал её равной 15. int.TryParseработает черезout: если преобразование удалось, возвращаетtrueи записывает число, иначе возвращаетfalse, не выбрасывая ошибку.out _означает, что результат нам не нужен.
Главное
- Заголовок метода: тип результата, имя, параметры —
double Area(double w, double h). - Метод
voidничего не возвращает; остальные возвращают значение черезreturn. - Метод из одного выражения можно кратко записать через
=>. - Значения по умолчанию (
int discount = 0) делают аргумент необязательным, а именованные аргументы (seats: 3) освобождают от порядка. - По умолчанию аргументы передаются копиями;
refпередаёт саму переменную, аoutвыдаёт результат наружу.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.
void?