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

Содержащийся в AddWrapper метод Add можно вызывать лишь из объемлющего метода AddWrapper. Почти наверняка вас интересует, что это вам дало? В приведенном примере мало что (если вообще что-либо). Но если функцию Add нужно вызывать во многих местах метода AddWrapper? И вот теперь вы должны осознать, что наличие локальной функции, не видимой за пределами того места, где она необходима, содействует повторному использованию кода. Вы увидите еще больше преимуществ, обеспечиваемых локальными функциями, когда мы будем рассматривать специальные итераторные методы (в главе 8) и асинхронные методы (в главе 15).

На заметку!AddWrapper является примером локальной функции с вложенной локальной функцией. Вспомните, что функции, объявляемые в операторах верхнего уровня, создаются как локальные функции. Локальная функция Add находится внутри локальной функции AddWrapper. Такая возможность обычно не применяется за рамками учебных примеров, но если вам когда-нибудь понадобятся вложенные локальные функции, то вы знаете, что они поддерживаются в С#.

В версии C# 9.0 локальные функции обновлены, чтобы позволить добавлять атрибуты к самой локальной функции, ее параметрам и параметрам типов, как показано далее в примере (не беспокойтесь об атрибуте NotNullWhen, который будет раскрыт позже в главе):

#nullable enable

private static void Process(string?[] lines, string mark)

{

    foreach (var line in lines)

    {

        if (IsValid(line))

        {

            // Логика обработки. ..

        }

    }

    bool IsValid([NotNullWhen(true)] string? line)

    {

        return !string.IsNullOrEmpty(line) && line.Length >= mark.Length;

    }

}

<p id="AutBody_Root151">Статические локальные функции (нововведение в версии 8.0)</p>

В версии C# 8 средство локальных функций было усовершенствовано — появилась возможность объявлять локальную функцию как статическую. В предыдущем примере внутри локальной функции Add производилась прямая ссылка на переменные из главной функции. Результатом могут стать неожиданные побочные эффекты, поскольку локальная функция способна изменять значения этих переменных.

Чтобы увидеть возможные побочные эффекты в действии, создайте новый метод по имени AddWrapperWithSideEffeet с таким кодом:

static int AddWrapperWithSideEffect(int x, int y)

{

  // Здесь должна выполняться какая-то проверка достоверности

  return Add;

  int Add

  {

    x += 1;

    return x + y;

  }

}

Конечно, приведенный пример настолько прост, что вряд ли что-то подобное встретится в реальном коде. Для предотвращения ошибки подобного рода добавьте к локальной функции модификатор static. Это не позволит локальной функции получать прямой доступ к переменным родительского метода, генерируя на этапе компиляции исключение CS8421, "A static local function cannot contain a reference to ‘<имя переменной>’" (Статическая локальная функция не может содержать ссылку на ‘<имя переменной>’).

Ниже показана усовершенствованная версия предыдущего метода:

static int AddWrapperWithStatic(int x, int y)

{

  // Здесь должна выполняться какая-то проверка достоверности

  return Add(x,y);

  static int Add(int x, int y)

  {

    return x + y;

  }

}

<p id="AutBody_Root152">Понятие параметров методов</p>

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

<p id="AutBody_Root153">Модификаторы параметров для методов</p>

Стандартный способ передачи параметра в функцию — по значению. Попросту говоря, если вы не помечаете аргумент каким-то модификатором параметра, тогда в функцию передается копия данных. Как объясняется далее в главе, то, что в точности копируется, будет зависеть от того, относится параметр к типу значения или к ссылочному типу.

Хотя определение метода в C# выглядит достаточно понятно, с помощью модификаторов, описанных в табл. 4.2, можно управлять способом передачи аргументов методу.

Чтобы проиллюстрировать использование перечисленных ключевых слов, создайте новый проект консольного приложения по имени FunWithMethods. А теперь давайте рассмотрим их роль.

<p id="AutBody_Root154">Стандартное поведение передачи параметров</p>

Когда параметр не имеет модификатора, поведение для типов значений предусматривает передачу параметра по значению, а для ссылочных типов — по ссылке.

На заметку! Типы значений и ссылочные типы рассматриваются позже в главе.

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

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

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

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

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

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

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

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

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