Выбрать главу

Range r = 0..2; //the end of the range is exclusive

foreach (var itm in gothicBands[r])

{

  // Вывести имя.

  Console.Write(itm + ", ");

}

Console.WriteLine("\n");

Диапазоны можно определять с применением целых чисел или переменных типа Index. Тот же самый результат будет получен посредством следующего кода:

Index idx1 = 0;

Index idx2 = 2;

Range r = idx1..idx2; // Конец диапазона является исключающим.

foreach (var itm in gothicBands[r])

{

  // Вывести имя.

  Console.Write(itm + ", ");

}

Console.WriteLine("\n");

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

gothicBands[..]

gothicBands[0..^0]

gothicBands[0..3]

Понятие методов

Давайте займемся исследованием деталей определения методов. Методы определяются модификатором доступа и возвращаемым типом (или void, если ничего не возвращается) и могут принимать параметры или не принимать их. Метод, который возвращает значение вызывающему коду, обычно называется функцией, а метод, не возвращающий значение, как правило, называют собственно методом.

На заметку! Модификаторы доступа для методов (и классов) раскрываются в главе 5. Параметры методов рассматриваются в следующем разделе.

До настоящего момента в книге каждый из рассматриваемых методов следовал такому базовому формату:

// Вспомните, что статические методы могут вызываться

// напрямую без создания экземпляра класса,

class Program

{

  // static воэвращаемыйТип ИмяМетода(список параметров)

  // { /* Реализация */ }

  static int Add(int x, int y)

  {

    return x + y;

  }

}

В нескольких последующих главах вы увидите, что методы могут быть реализованы внутри области видимости классов, структур или интерфейсов (нововведение версии C# 8).

Члены, сжатые до выражений

Вы уже знаете о простых методах, возвращающих значения, вроде метода Add(). В версии C# 6 появились члены, сжатые до выражений, которые сокращают синтаксис написания однострочных методов. Например, вот как можно переписать метод Add():

static int Add(int x, int y) => x + y;

Обычно такой прием называют "синтаксическим сахаром", имея в виду, что генерируемый код IL не изменяется по сравнению с первоначальной версией метода. Он является всего лишь другим способом написания метода. Одни находят его более легким для восприятия, другие — нет, так что выбор стиля зависит от ваших персональных предпочтений (или предпочтений команды разработчиков).

На заметку! Не пугайтесь операции =>. Это лямбда-операция, которая подробно рассматривается в главе 12, где также объясняется, каким образом работают члены, сжатые до выражений. Пока просто считайте их сокращением при написании однострочных операторов.

Локальные функции (нововведение в версии 7.0, обновление в версии 9.0)

В версии C# 7.0 появилась возможность создавать методы внутри методов, которые официально называются локальными функциями. Локальная функция является функцией, объявленной внутри другой функции, она обязана быть закрытой, в версии C# 8.0 может быть статической (как демонстрируется в следующем разделе) и не поддерживает перегрузку. Локальные функции допускают вложение: внутри одной локальной функции может быть объявлена еще одна локальная функция.

Чтобы взглянуть на средство локальных функций в действии, создайте новый проект консольного приложения по имени FunWithLocalFunctions. Предположим, что вы хотите расширить используемый ранее пример с методом Add() для включения проверки достоверности входных данных. Задачу можно решить многими способами, простейший из которых предусматривает добавление логики проверки достоверности прямо в сам метод Add(). Модифицируйте предыдущий пример следующим образом (логика проверки достоверности представлена комментарием):