Читаем Язык программирования C#9 и платформа .NET5 полностью

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

gothicBands[..]

gothicBands[0..^0]

gothicBands[0..3]

<p id="AutBody_Root148">Понятие методов</p>

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

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

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

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

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

class Program

{

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

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

  static int Add(int x, int y)

  {

    return x + y;

  }

}

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

<p id="AutBody_Root149">Члены, сжатые до выражений</p>

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

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

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

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

<p id="AutBody_Root150">Локальные функции (нововведение в версии 7.0, обновление в версии 9.0)</p>

В версии C# 7.0 появилась возможность создавать методы внутри методов, которые официально называются локальными функциями. Локальная функция является функцией, объявленной внутри другой функции, она обязана быть закрытой, в версии C# 8.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;

  }

}

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT