При знакомстве с Visual Studio мы также имели возможность познакомиться и с полной структурой программы на C#. Теперь, когда мы определились с инструментом для работы, можно полностью погрузиться в мир программирования на C# и в этой части мы рассмотрим структуру программы.
Структура программы на C#
Любая программа на C# состоит из одного или нескольких файлов. Например, даже для первой программы на C# создаются такие файлы как Program.cs и [Имя_проекта].csproj. В файлах с расширением *.cs содержится код программы.
Внутри файла Program.cs в зависимости от шаблона по которому создается приложение мы можем один из двух вариантов кода:
Console.WriteLine("Hello, World");
namespace HelloWorld { internal class Program { static void Main(string[] args) { Console.WriteLine("Hello, World"); } } }
В первом случае (для C# 9 и более поздних версий) программа использует инструкции верхнего уровня (Top-Level Statement, также можно встретить название «Операторы верхнего уровня»). Возможность использования инструкций верхнего уровня появилась, начиная с версии C# 9 и позволяет нам избавиться от некоторых формальностей при написании приложений. В любом случае, наша программа будет работать абсолютно одинаково, что в первом, что во втором случае — в консоль будет выведено сообщение «Hello, World!». При этом, в случае использования инструкций верхнего уровня мы сразу видим перед собой главный строительный блок любого приложения — инструкцию
Console.WriteLine("Hello, World");
Инструкции
Инструкции — это какое-то действие, которое мы просим программу выполнить. Это может быть вывод текста на экран, математическая операция, присвоение значения переменной и так далее. Любая инструкция в языке C# оканчивается символом «точка с запятой». Хорошим тоном в программировании считается, когда одна инструкция занимает одну строку или же, если инструкция большая (например, содержит цепочку вызовов каких-то методов) располагается на нескольких строках и умещается в ширину экрана.
Console.WriteLine("Введите своё имя: "); string name = Console.ReadLine(); Console.WriteLine($"Привет, {name}!"); Console.ReadKey();
Каждая инструкция занимает одну строку кода и умещается в ширину экрана.
Console.WriteLine("Введите своё имя: "); string name = Console.ReadLine(); Console.WriteLine($"Привет, {name}!"); Console.ReadKey();
Все инструкции размещены в одной строке, что значительно усложняет чтение кода
Несколько инструкций могут объединяться в блоки кода.
Блоки кода
Блоки кода в C# заключаются в фигурные скобки ({...}
). Блоки кода могут использоваться для различных задач — для определения тела метода, блоки кода объединяют различные типы данных внутри пространства имен одни блоки кода могут содержать внутри себя другие блоки и т.д. Использование блоков кода прекрасно демонстрируется во втором случае создания программы в Visual Studio без использования операторов верхнего уровня:

Комментарии
Ещё один важный элемент любой программы — это комментарии. Комментарий — это обычный текст, который не используется компилятором при сборке, однако помогает программисту сделать код более понятным. Комментарии в C# бывают однострочными и многострочными. Однострочный комментарий начинается с символов //
, занимает одну строку и может размещаться на отдельной строке или после инструкции. Например, мы могли бы добавить в наше первое приложение такие комментарии:
Console.WriteLine("Введите своё имя: "); //вывод текста string name = Console.ReadLine(); //считываем имя пользователя в переменную name Console.WriteLine($"Привет, {name}!"); //выводим на экран приветствие Console.ReadKey(); //ждем, пока пользователь нажмет какую-нибудь клавишу
здесь все комментарии располагаются сразу после инструкций. Иногда бывает необходимым оставить в качестве комментария большой объем текста или «закомментировать» блок кода, чтобы он не выполнялся при работе приложения. Для таких целей используются многострочные комментарии, которые начинаются с символов /*
и заканчиваются символами */
. Например, дадим небольшое описание нашей программе в виде многострочного комментария:
/* Эта программа просит пользователя ввести своё имя и выводит приветствие на экран Код взят с сайта http://csharp.webdelphi.ru По всем вопросам работы с программой обращаться по адресу... */ namespace HelloWorld { internal class Program { static void Main(string[] args) { Console.WriteLine("Введите своё имя: "); //вывод текста string name = Console.ReadLine(); //считываем имя пользователя в переменную name Console.WriteLine($"Привет, {name}!"); //выводим на экран приветствие Console.ReadKey(); //ждем, пока пользователь нажмет какую-нибудь клавишу } } }
С кодом приложения немного разобрались. Теперь переключим наше внимание на второй важный файл нашей программы — файл проекта с расширение *.cproj
Файл проекта .*cproj
Каждый проект C# содержит файл проекта. В этом файле содержится основная информация о конфигурации проекта. Посмотрим на содержимое этого файла. Для этого, в обозревателе решений Visual Studio необходимо кликнуть правой кнопкой мыши по названию проекта и в контекстном меню выбрать пункт «Изменить файл проекта»:
В редакторе кода мы увидим следующий текст:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
Это обычный файл в формате xml в котором может содержаться довольно много различной информации о проекте. Рассмотрим основные элементы этого файла проекта и что они означают:
OutputType |
определяет тип выходного файла приложения (сборки). Exe — создается файл с расширением *.exe, который мы можем запустить на выполнение двойным кликом мышки. Dll — на выходе получим библиотеку с расширением *.dll, которую можно будет подключать к другим проектам. По умолчанию мы создаем exe-файл |
TargetFramework |
Целевая платформа под которую будет собираться проект. В данном случае наш проект «нацелен» на платформу .NET 9. Со всеми возможными вариантами этого параметра можно ознакомиться в справке Microsoft. |
ImplicitUsings |
используется для включения или отключения неявных директив global using в проектах C#, предназначенных для .NET 6 или более поздней версии, и C# 10 или более поздней версии. |
Nullable |
Для C# 8.0 и выше (не путать с .NET 8) позволяет включать или отключать так называемый nullable-контекст. О том, что это такое и зачем нужно мы также поговорим далее, когда разберемся с основными типами данных C# |
Если Вы используете для работы Visual Studio, то эти и другие настройки проекта можно посмотреть в более удобном виде в свойствах проекта:
Итого
Итак, на примере простенькой программы мы рассмотрели структуру приложения в C# — изучили основные «строительные блоки» приложения такие как инструкции, блоки кода, комментарии. А также немного познакомились с файлом проекта и его некоторыми настройками. Теперь можно приступать созданию приложение чуть сложнее, чем обычный «Hello, world»