Бесплатный курс по C#. Зарегистрируйтесь для отслеживания прогресса →

C#: Создание (определение) метода

Определение собственных методов значительно упрощает написание и поддержку программ. Методы позволяют объединять сложные (составные) операции в одну. Например, отправка письма на сайте - это достаточно сложный процесс, включающий в себя взаимодействие с внешними системами (интернет). Благодаря возможности определять методы, вся сложность может быть скрыта за одним простым методом:

// Место откуда берется класс с методом
using MailerLib;

var email = "support@hexlet.io";
var title = "Помогите";
var body = "Я написал историю успеха, как я могу получить скидку?";

// Mailer – имя класса по аналогии с Console, который мы уже многократно использовали
// Один маленький вызов — и много логики внутри
Mailer.Send(email, title, body);

Создадим наш первый метод. Его задача - вывести на экран текущую дату:

Today is: 2021-10-25
// Объявление класса
class App
{
    // Определение метода
    public static void ShowCurrentDate()
    {
        // Класс со свойством для получения текущего времени
        var currentDate = DateTime.Now;
        var text = $"Today is: {currentDate}";
        Console.WriteLine(text);
    }
}

// Вызов метода
// Обязательно указывать имя класса
App.ShowCurrentDate(); // => "Today is: 09.12.2021 10:52:13"

Определение метода в C# включает в себя много страшных слов, которые мы постепенно разберем.

Объявление класса

class App
{
    // ...
}

Класс объявляется через ключевое слово class, за которым следует имя создаваемого класса App. Потом идут фигурные скобки {} между которыми идет наполнение этого класса. Проще всего воспринимать класс как "контейнер" для методов. Представьте себе ящик с инструментами (класс) в котором лежат нужные инструменты (методы).

Console.WriteLine("Hello");
// Console – "контейнер" для инструментов работы с консолью
// WriteLine() – "инструмент" для вывода информации в консоль

Помимо WriteLine() в Console есть и другие свойства и методы. Попробуйте найти в документации что еще можно делать через этот класс.

Определение метода в классе

class App
{
    // Определение метода
    public static void ShowCurrentDate()
    {
        // ...
    }
}

Определение метода в C# включает в себя много страшных слов, которые мы постепенно разберем. В целом, их можно разделить на две группы: то, что влияет на работу самого метода и то как этот метод видим за пределами класса.

За видимость отвечает слово public, оно дает возможность вызывать методы снаружи класса, как в примере выше. Если бы мы забыли добавить слово public, то метод считался бы private – приватным. Приватные методы нельзя вызывать снаружи класса.

class App
{
    // Определение метода. Слово public пропущено
    static void ShowCurrentDate()
    {
        // ...
    }
}

// вызовет ошибку компиляции:
// error CS0122: 'App.ShowCurrentDate()' is inaccessible due to its protection level
App.ShowCurrentDate();

За работу метода отвечают static и void.

static отвязывает метод от объекта и делает возможным его вызов напрямую из класса. На протяжение этого курса, все методы, которые мы создадим, будут статичными. Поэтому просто не забывайте его ставить каждый раз, когда создаете метод.

void используется тогда, когда метод ничего не возвращает. Например такое определение у метода WriteLine(). А вот если метод возвращает какие-то данные, то вместо void будет указан тип возвращаемых данных. Подробнее об этом в следующем уроке.

В отличие от обычных данных, методы выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то».

Всё, что описывается внутри фигурных скобок {} после имени метода, называется телом метода. Внутри тела можно описывать любой код. Считайте, что это маленькая самостоятельная программа, набор произвольных инструкций. Тело выполняется ровно в тот момент, когда запускается метод. Причём каждый вызов метода запускает тело независимо от других вызовов. Кстати, тело может быть пустым:

// Минимальное определение метода
public class App 
{
    public static void Noop() 
    {
        // Тут мог бы быть код, но его нет
        // Обратите внимание на отступы
        // Для читаемости, любой код внутри тела сдвигается вправо на 4 пробела
    }
}

App.Noop();

Понятие «создать метод» имеет много синонимов: «реализовать», «определить» и даже «заимплементить» (от слова implement). Все они встречаются в повседневной практике на работе.

Задание

Реализуйте класс App со статическим методом с именем PrintMotto(), который выведет на экран фразу Winter is coming. Тесты будут вызывать ваш код вот так:

App.PrintMotto(); // => Winter is coming

Чтобы мы могли вызвать этот метод снаружи, нужно его пометить не только ключевым словом static, но еще и public.

Не забудьте! В задачах, в которых нужно реализовать метод, этот метод вызывать не нужно. Вызывать метод будут автоматизированные тесты, которые проверяют его работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваш метод будет использоваться.

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе