Если не указано начало диапазона, тогда используется начало последовательности. Если не указан конец диапазона, тогда применяется длина диапазона. Ошибка не возникает, т.к. конец диапазона является исключающим. В предыдущем примере с массивом, содержащим три элемента, все диапазоны представляют одно и то же подмножество:
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;
Обычно такой прием называют
На заметку! Не пугайтесь операции =>
. Это лямбда-операция, которая подробно рассматривается в главе 12, где также объясняется, каким образом работают члены, сжатые до выражений. Пока просто считайте их сокращением при написании однострочных операторов.
Локальные функции (нововведение в версии 7.0, обновление в версии 9.0)
В версии C# 7.0 появилась возможность создавать методы внутри методов, которые официально называются
Чтобы взглянуть на средство локальных функций в действии, создайте новый проект консольного приложения по имени FunWithLocalFunctions
. Предположим, что вы хотите расширить используемый ранее пример с методом Add
для включения проверки достоверности входных данных. Задачу можно решить многими способами, простейший из которых предусматривает добавление логики проверки достоверности прямо в сам метод Add
. Модифицируйте предыдущий пример следующим образом (логика проверки достоверности представлена комментарием):
static int Add(int x, int y)
{
// Здесь должна выполняться какая-то проверка достоверности.
return x + y;
}
Как видите, крупных изменений здесь нет. Есть только комментарий, в котором указано, что реальный код должен что-то делать. А что, если вы хотите отделить фактическую реализацию цели метода (возвращение суммы аргументов) от логики проверки достоверности аргументов? Вы могли бы создать дополнительные методы и вызывать их из метода Add
. Но это потребовало бы создания еще одного метода для использования только в методе Add
. Такое решение может оказаться излишеством. Локальные функции позволяют сначала выполнять проверку достоверности и затем инкапсулировать реальную цель метода, определенного внутри метода AddWrapper
:
static int AddWrapper(int x, int y)
{
// Здесь должна выполняться какая-то проверка достоверности.
return Add;
int Add
{
return x + y;
}
}
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT