Методы в C#: определение, вызов, рекурсия и параметры
Что такое метод
Метод — это группа инструкций, выполняющих задачу. Любая C# программа имеет точку входа — метод Main. Для использования метода нужно: (1) определить, (2) вызвать.
Синтаксис определения метода
<модификатор_доступа> <тип_возвращаемого_значения> <ИмяМетода>(список_параметров)
{
// тело метода
}
Элементы метода
- Модификатор доступа — видимость (
public,private, ...) - Тип возвращаемого значения — тип данных результата;
void, если ничего не возвращает - Имя метода — уникальный идентификатор, чувствителен к регистру
- Список параметров — типы, порядок и количество параметров в скобках; может быть пустым
- Тело метода — инструкции для выполнения задачи
Пример: метод FindMax
public class NumberManipulator
{
public int FindMax(int num1, int num2)
{
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
}
Вызов методов
Через экземпляр класса (для нестатических методов):
NumberManipulator n = new NumberManipulator();
int ret = n.FindMax(100, 200);
Console.WriteLine($"Max: {ret}"); // 200
Статические методы вызываются через имя класса: ClassName.Method().
Рекурсивные методы
Метод может вызывать сам себя. Классический пример — факториал:
public int Factorial(int n)
{
if (n <= 1) return 1;
return n * Factorial(n - 1);
}
// Вызов:
Console.WriteLine(Factorial(6)); // 720
Console.WriteLine(Factorial(7)); // 5040
Console.WriteLine(Factorial(8)); // 40320
Важно: Рекурсия требует базового случая (base case), иначе — StackOverflowException.
Передача параметров
| Механизм | Ключевое слово | Описание |
|---|---|---|
| По значению | (по умолчанию) | Копируется значение аргумента. Изменения внутри метода не влияют на оригинал. |
| По ссылке | ref | Передаётся ссылка на переменную. Изменения затрагивают оригинал. Переменная должна быть инициализирована до вызова. |
| Выходной параметр | out | Как ref, но переменная НЕ обязана быть инициализирована до вызова. Метод ОБЯЗАН присвоить значение перед выходом. Используется для возврата нескольких значений. |
| Только для чтения по ссылке | in (C# 7.2+) | Передача по ссылке с запретом изменения в методе. Оптимизация для больших структур. |
| Массив параметров | params | Позволяет передать переменное число аргументов как массив. Только последний параметр. |
Примеры
// По значению
void ByValue(int x) { x = 10; }
int a = 5; ByValue(a); // a остаётся 5
// По ссылке (ref)
void ByRef(ref int x) { x = 10; }
int b = 5; ByRef(ref b); // b становится 10
// Выходной (out)
void ByOut(out int x) { x = 10; }
int c; ByOut(out c); // c = 10 (c не был инициализирован)
// params
int Sum(params int[] numbers)
{
int sum = 0;
foreach (int n in numbers) sum += n;
return sum;
}
Console.WriteLine(Sum(1, 2, 3, 4)); // 10
Console.WriteLine(Sum(new[] { 5, 5 })); // 10
Дополнительные возможности (современный C#)
- Expression-bodied members:
public int Square(int x) => x * x; - Optional parameters:
void Greet(string name = "Guest") - Named arguments:
Greet(age: 25, name: "Anna") - Local functions: методы внутри методов (C# 7.0+)
- Async/await: асинхронные методы возвращают
Task/Task<T>
Язык C
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Освоение перегрузки методов в C#: концепции, примеры и лучшие практики
- Функции в C: объявление, определение, вызов, аргументы (по значению и по ссылке), рекурсия
- Битовые поля в C: компактное хранение флагов и малых целых чисел
- Функции с переменным числом аргументов в C: практическое руководство
- Java 8 Default Methods: улучшение интерфейсов и обратная совместимость
- Интегрирование в MATLAB: от неопределенных интегралов к суммам Римана
- Понимание делегатов в C#: Руководство по ссылкам на методы и событиям