Перейти к основному содержимому

Управление областью действия переменных и логикой с помощью блоков кода в C#.

Введение

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

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

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

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

Цели обучения

В этом модуле вы узнаете:

  • Поймете, как влияет объявление и инициализация переменных внутри и вне блоков кода.
  • Улучшите читаемость кодовых блоков в операторах if.

Упражнение - Блоки кода и область видимости переменных

Блок кода - это один или несколько операторов C#, которые определяют путь выполнения. Операторы, находящиеся за пределами блока кода, влияют на то, когда, если и как часто этот блок кода будет выполняться во время выполнения. Границы блока кода обычно определяются фигурными скобками .

Помимо влияния на путь выполнения, блоки кода могут также влиять на область видимости ваших переменных. Примеры кода, которые вы рассмотрите в этом упражнении, помогут вам понять взаимосвязь между блоками кода и областью видимости переменных.

Блоки кода влияют на область видимости объявления переменной

Область видимости переменной - это видимость переменной для остального кода в вашем приложении. Переменная с локальной областью видимости доступна только внутри блока кода, в котором она определена. Если вы попытаетесь получить доступ к переменной вне блока кода, вы получите ошибку компилятора.

В оставшейся части этого раздела мы рассмотрим связь между блоками кода и областью видимости переменных.

Создайте переменную внутри блока кода

Для начала рассмотрим случай, когда переменная инициализируется внутри блока кода.

  1. Создайте новый проект. Убедитесь, что у вас открыт Visual Studio и на панели редактора отображается файл Program.cs.
  2. Введите следующий код в редактор кода Visual Studio:
bool flag = true;
if (flag)
{
int value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
  1. В меню Visual Studio File выберите Save. Файл Program.cs должен быть сохранен перед сборкой или запуском кода.
  2. Вы должны увидеть следующий результат:
Inside the code block: 10

Это ожидаемый результат. Но что, если вы хотите получить доступ к значению переменной вне блока кода оператора if?

Попытка получить доступ к переменной вне блока кода, в котором она объявлена

  1. В редакторе кода Visual Studio создайте новую строку кода под блоком кода оператора if.
  2. В пустой строке кода, которую вы создали, добавьте следующую строку кода:
Console.WriteLine($"Outside the code block: {value}");
  1. Убедитесь, что ваш обновленный код выглядит следующим образом:
bool flag = true;
if (flag)
{
int value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
  1. Сохраните файл с кодом, а затем используйте Visual Studio для запуска кода.
  2. Обратите внимание, что при попытке запустить приложение вы получаете ошибку компиляции:
Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context

Часть сообщения Program.cs(7,46) говорит о том, что ошибка связана со строкой 7 в файле Program.cs, столбец 46.

Эта ошибка возникает потому, что переменная, объявленная внутри блока кода, доступна (видна) только в этом блоке кода. Поскольку к переменной нельзя получить доступ вне блока кода, в котором она объявлена, к значению нельзя получить доступ из строки 7 вашего кода.

Переменная, объявленная в блоке кода метода, называется локальной переменной. Вы можете встретить термин «локальная переменная» при изучении статей, в которых обсуждается область видимости переменных.

Переместите объявление переменной выше блока кода

Чтобы получить доступ к переменной как внутри, так и вне блока кода, необходимо объявить переменную перед блоком кода (над ним), чтобы код вне блока кода мог «видеть» переменную.

  1. Обновите свой код в редакторе кода Visual Studio следующим образом:
bool flag = true;
int value;

if (flag)
{
Console.WriteLine($"Inside the code block: {value}");
}

value = 10;
Console.WriteLine($"Outside the code block: {value}");
  1. Уделите минуту просмотру обновлений.
  2. Обратите внимание, что значение теперь объявляется (но не инициализируется) вне блока кода if.
  3. С помощью Visual Studio сохраните обновления, а затем запустите код/
  4. Обратите внимание, что вы по-прежнему получаете ошибку компиляции.

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

Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'

Ошибка связана со строкой 6 внутри блока кода, поскольку значение value является неинициализированным (ему не присвоено значение). Если бы строка кода value = 10; располагалась над блоком кода оператора if, то приложение скомпилировалось бы правильно и все было бы в порядке. Однако, поскольку значение не было инициализировано, к нему нельзя получить доступ внутри блока кода.

Убедитесь, что ваши переменные инициализированы перед попыткой доступа к ним, это решит эту проблему.

Инициализация переменной как часть объявления переменной

  1. Чтобы инициализировать значение как часть объявления переменной, обновите код следующим образом:
bool flag = true;
int value = 0;

if (flag)
{
Console.WriteLine($"Inside the code block: {value}");
}

value = 10;
Console.WriteLine($"Outside the code block: {value}");

Этот код устраняет ошибку компиляции "unassigned local variable", инициализируя значение как часть объявления переменной.

  1. Используйте Visual Studio для сохранения и запуска вашего кода.
  2. Обратите внимание, что теперь, когда вы запускаете приложение, вы видите следующий результат:
Inside the code block: 0
Outside the code block: 10

Изучите, как компилятор интерпретирует ваш код

Чтобы избежать ошибок во время выполнения, компилятор C# анализирует ваш код в редакторе кода Visual Studio и в процессе сборки. Однако компилятор не всегда может интерпретировать ваш код так же, как и вы.

Рассмотрим следующие два примера кода, которые, как кажется, служат одной и той же цели:

// Code sample 1
bool flag = true;
int value;

if (flag)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}

Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;

if (true)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}

Console.WriteLine($"Outside the code block: {value}");

Вам может показаться, что эти два примера всегда должны давать одинаковый результат, но компилятор C# интерпретирует эти два примера кода по-разному.

Для первого примера кода компилятор интерпретирует flag как булеву переменную, которой можно присвоить значение true или false. Компилятор приходит к выводу, что если flag равен false, то значение не будет инициализировано при выполнении второй функции Console.WriteLine(). По сути, компилятор считает возможными следующие два пути выполнения кода:

// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");

И

// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");

Поскольку компилятор рассматривает второй путь как возможный (для примера кода 1), он выдает сообщение об ошибке в процессе сборки. Кроме того, редактор кода в Visual Studio предупреждает об этой проблеме, отображая красную волнистую линию под значением (под блоком кода).

Для второго примера кода компилятор делает вывод, что содержимое блока кода оператора if будет выполняться всегда (true - это всегда true). Компилятор не генерирует ошибку сборки, поскольку интерпретирует второй пример кода как имеющий единственный путь выполнения следующим образом:

int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");

Резюме

Вот несколько важных вещей, которые следует помнить о блоках кода:

  • Когда вы объявляете переменную внутри блока кода, ее видимость локальна для этого блока кода, и к ней нельзя получить доступ вне блока кода.
  • Чтобы переменная была видна как внутри, так и вне блока кода, вы должны объявить ее до блока кода (вне и над блоком кода).
  • Убедитесь, что переменные инициализируются до того, как ваш код попытается получить к ним доступ (для всех потенциальных путей выполнения кода).

Упражнение - удаление блоков кода из операторов if

Разработчикам программного обеспечения нравится, когда они могут написать код, который экономит нажатия клавиш и визуальное пространство, не жертвуя при этом читабельностью. Применяйте фразу «меньше - значит больше» в процессе разработки только тогда, когда это сделает ваш код более читабельным и понятным.

Если блок кода состоит всего из одной строки, то, скорее всего, вам не нужно определять формальный блок кода с помощью фигурных скобок. Хотя технически вам даже не нужно разделять код на несколько строк, объединение утверждений в одной строке может сделать ваш код трудночитаемым.

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

Создайте пример оператора if, в котором используется блок кода

  1. Создайте новый проект. Убедитесь, что в Visual Studio открыт пустой файл Program.cs.
  2. Введите следующий код в редактор кода Visual Studio:
bool flag = true;
if (flag)
{
Console.WriteLine(flag);
}
  1. Убедитесь, что вы видите следующий вывод
True

Ваш код представляет собой хорошую отправную точку, но у вас есть блок кода, который включает единственную строку кода. Нужно ли в этом случае определять блок кода?

Удалите фигурные скобки

Приведенный выше код выполняет блок кода, когда флаг равен true. Поскольку этот блок кода содержит одну строку кода, у вас есть возможность удалить фигурные скобки.

  1. Обновите код в редакторе кода Visual Studio следующим образом:
bool flag = true;
if (flag)
Console.WriteLine(flag);
примечание

Удаление фигурных скобок не изменит того факта, что Console.WriteLine(flag); является блоком кода для оператора if.

  1. Обратите внимание, что вывод такой же, как и раньше. Вы должны увидеть следующий вывод:
True

Однако строк кода стало на две меньше. Самое главное, что благодаря отступу строки кода под if ваш код по-прежнему легко читается.

Изучите читабельность однострочных формуляров if

В этом шаге мы рассмотрим случай, когда читаемость кода может пострадать.

Поскольку и оператор if, и вызов метода Console.WriteLine() коротки, у вас может возникнуть соблазн объединить их в одной строке. В конце концов, синтаксис C# для оператора if позволяет объединять утверждения таким образом.

  1. Обновите код в редакторе кода Visual Studio следующим образом:
bool flag = true;
if (flag) Console.WriteLine(flag);
  1. Сохраните файл с кодом, а затем используйте Visual Studio для запуска кода.

  2. Обратите внимание, что вывод все тот же.

  3. Потратьте минуту на то, чтобы подумать о читабельности кода.

Представьте, что два предыдущих примера кода вложены в более крупный участок кода. Комбинирование операторов кода (как это было сделано в шаге 4) может затруднить чтение.

При реализации оператора if, включающего блок кода с одним оператором, Microsoft рекомендует учитывать следующие соглашения:

  • Никогда не используйте однострочную форму (например: if (flag) Console.WriteLine(flag));
  • Использование скобок всегда допустимо и обязательно, если любой блок составного оператора if/else if/.../else использует скобки или если тело одного оператора занимает несколько строк.
  • Скобки могут быть опущены только в том случае, если тело каждого блока, связанного с составным оператором if/else if/.../else, размещается на одной строке.
  1. Чтобы оценить влияние на читаемость больших конструкций if-elseif-else, обновите свой код следующим образом:
string name = "steve";
if (name == "bob") Console.WriteLine("Found Bob");
else if (name == "steve") Console.WriteLine("Found Steve");
else Console.WriteLine("Found Chuck");
  1. Сохраните файл с кодом и запустите его с помощью Visual Studio. При запуске кода должен появиться следующий вывод:
Found Steve

Код выполняется, но эти строки кода плотные и трудночитаемые. Возможно, вы захотите переформатировать код, добавив перенос строки после операторов if, else if и else.

  1. Сравните код, который вы только что выполнили, со следующим кодом:
string name = "steve";

if (name == "bob")
Console.WriteLine("Found Bob");
else if (name == "steve")
Console.WriteLine("Found Steve");
else
Console.WriteLine("Found Chuck");

Обратите внимание, насколько легче читать второй пример кода.

Отзыв

Вот несколько важных вещей, которые следует помнить о блоках кода оператора if и читабельности:

  • Если вы понимаете, что в блоках кода оператора if-elseif-else содержится только одна строка кода, вы можете удалить фигурные скобки из блока кода и пробелы. Microsoft рекомендует использовать фигурные скобки последовательно для всех блоков кода оператора if-elseif-else (либо присутствуют, либо удаляются последовательно).
  • Удаляйте фигурные скобки из блока кода только в том случае, если это делает код более читабельным. Всегда допустимо включать фигурные скобки.
  • Удаляйте перевод строки, только если это делает код более читабельным. Microsoft считает, что ваш код будет более читабельным, если каждое утверждение будет располагаться на отдельной строке кода.

Упражнение - Выполните задание с использованием области видимости переменных

Задача про область переменных

В этой задаче вам предстоит использовать полученные знания о блоках кода и области переменных, чтобы исправить плохо написанный пример кода. Вы можете внести множество улучшений. Удачи!

Обновить проблемный код в редакторе кода

  1. Создайте новый проект
  2. Введите следующий код в редактор кода Visual Studio:
int[] numbers = { 4, 8, 15, 16, 23, 42 };

foreach (int number in numbers)
{
int total;

total += number;

if (number == 42)
{
bool found = true;

}

}

if (found)
{
Console.WriteLine("Set contains 42");

}

Console.WriteLine($"Total: {total}");
  1. Просмотрите предполагаемый результат. После внесения необходимых изменений в код ваше приложение должно выдать следующий результат:
Set contains 42
Total: 108
  1. Выполните необходимые обновления кода, чтобы существующие операторы Console.WriteLine() выдавали желаемый результат. Возможно, потребуется изменить область видимости переменных.
  2. Оптимизируйте код для удобства чтения. В зависимости от количества пробельных символов и некоторых других факторов, у вас должно быть около 17 строк кода.

Заключение

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

Вы изучили влияние объявления переменных внутри и вне границ блока кода. Вы также рассмотрели влияние инициализации переменных на доступность, а также то, как удаление ненужных блоков кода может повлиять на читаемость кода.

Код, в котором используются неправильно заданные или инициализированные переменные, приводит к ошибкам во время выполнения. Умение правильно определять область видимости и инициализировать переменные обеспечит лучший пользовательский опыт работы с приложениями.