Чтение онлайн

на главную

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

В версии 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;

}

}

Статические локальные функции (нововведение в версии 8.0)

В версии 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;

}

}

Понятие параметров методов

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

Модификаторы

параметров для методов

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

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

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

FunWithMethods
. А теперь давайте рассмотрим их роль.

Стандартное поведение передачи параметров

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

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

Стандартное поведение для типов значений

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

Program
следующий метод, который оперирует с двумя параметрами числового типа, передаваемыми по значению:

// По умолчанию аргументы типов значений передаются по значению.

static int Add(int x, int y)

{

int ans = x + y;

// Вызывающий код не увидит эти изменения,

// т.к. модифицируется копия исходных данных

// original data.

x = 10000;

y = 88888;

return ans;

}

Числовые данные относятся к категории типов значений. Следовательно, в случае изменения значений параметров внутри контекста члена вызывающий код будет оставаться в полном неведении об этом, потому что изменения вносятся только в копию первоначальных данных из вызывающего кода:

Console.WriteLine("***** Fun with Methods *****\n");

// Передать две переменные по значению.

int x = 9, y = 10;

Console.WriteLine("Before call: X: {0}, Y: {1}", x, y);

// Значения перед вызовом

Console.WriteLine("Answer is: {0}", Add(x, y));

// Результат сложения

Console.WriteLine("After call: X: {0}, Y: {1}", x, y);

Поделиться:
Популярные книги

Релокант. По следам Ушедшего

Ascold Flow
3. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. По следам Ушедшего

Маверик

Астахов Евгений Евгеньевич
4. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Маверик

Измена. Он все еще любит!

Скай Рин
Любовные романы:
современные любовные романы
6.00
рейтинг книги
Измена. Он все еще любит!

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Мама из другого мира. Делу - время, забавам - час

Рыжая Ехидна
2. Королевский приют имени графа Тадеуса Оберона
Фантастика:
фэнтези
8.83
рейтинг книги
Мама из другого мира. Делу - время, забавам - час

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Кодекс Охотника. Книга XXII

Винокуров Юрий
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXII

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Я тебя не предавал

Бигси Анна
2. Ворон
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не предавал

Измена. Право на счастье

Вирго Софи
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на счастье

Не грози Дубровскому! Том 11

Панарин Антон
11. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том 11

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Авиатор: назад в СССР 14

Дорин Михаил
14. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 14