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(). Модифицируйте предыдущий пример следующим образом (логика проверки достоверности представлена комментарием):