Структура программы на C# - C# и .NET

Структура программы на C#

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

Базовая структура программы на C#

Вначале рассмотрим базовую структуру. Любой проект C# состоит из одного или нескольких файлов. Например, даже для первой программы на C# создаются такие файлы как Program.csи [Имя_проекта].csproj. Исходный код программы содержится в файлах с расширением *.cs. Вместе с этим, начиная с версии языка C# 9 состав файла Program.cs изменился, благодаря нововведению, которое называется “операторы верхнего уровня” (Top-Level Statement), которые позволяют избавиться разработчику от некоторых формальностей при создании проекта, однако могут немного запутать новичка. Чтобы продемонстрировать о чем идет речь, откройте Visual Studio и создайте новый проект консольного приложения, как мы это делали в предыдущей части, но в окне “Дополнительные сведения” установите флажок “Не использовать операторы верхнего уровня”:

Как только вы нажмете кнопку “Создать” будет создан новый проект с базовой структурой программы на C# – вот такой:

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

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

using System;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

Этот код C# выполняет абсолютно тоже самое, что и наша первая программа на C# – выводит в консоль приветствие “Hello, World!”. Можете сравнить на сколько современный исходный код C# такого простого консольного приложения отличается от представленного выше. Однако, стоит отметить, что такое упрощение используется в файле Program.cs, но в других файлах проекта мы всё равно придерживаемся полной структуры. Посмотрим из чего состоит структура программы на C#

using System;

Ключевое слово using– это, в данном случае, директива с помощью которой мы подключаем к нашему проекту пространство имен System. О пространствах имен мы поговорим подробно в одной из следующих частей. Пока же вам необходимо знать, что таким образом мы получаем доступ к каким-либо возможностям языка. Например, в нашем случае, подключив пространство имен System, мы получили доступ к классу ConsoleВ дальнейшем мы будем часто подключать к нашему проекту различные пространства имен.

Далее мы видим объявление пространства имен нашего проекта:

namespace ConsoleApp3

таким образом, мы объявляем собственное пространство имен ConsoleApp3 По умолчанию, для проекта на C# создается пространство имен с именем, соответствующим имени проекта.

Далее идет блок кода – часть исходного кода, заключенного в фигурные скобки {...}внутри которого расположен основной код нашего приложения. Блоки кода могут использоваться для различных задач: блоки кода могут объединять различные элементы внутри пространства имен, могут содержать в себе другие блоки кода, группировать части исходного кода и так далее. На данный момент мы можем увидеть сразу три блока кода в нашем проекте:
Для удобства, в Visual Studio каждый блок кода выделяется в редакторе вертикальной пунктирной линией. Внутри блока кода, который на рисунке выделен синей линией, располагается объявление класса Program

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}

Опять же, все члены класса заключаются в блок кода. Так, наш класс Programпока содержит только один метод – Main():

static void Main(string[] args)
{
    Console.WriteLine("Hello, World!");
}

Метод Main()также называют точкой входа. Именно с этого метода начинается выполнение любой программы на C#. Внутри метода содержится всего одна инструкция:

Console.WriteLine("Hello, World!");

Инструкции — это какое-то действие, которое мы просим программу выполнить. В нашем случае – это вывод строки в консоль. Любая инструкция в языке C# оканчивается символом «точка с запятой». Хорошим тоном в программировании считается, когда одна инструкция занимает одну строку или же, если инструкция большая (например, содержит цепочку вызовов каких-то методов) располагается на нескольких строках и умещается в ширину экрана.

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

Структура программы на C#

Комментарии в коде C#

Отдельно стоит остановиться на таком важном элементе программы на C# как комментарии.

Комментарий — это обычный текст, который не используется компилятором при сборке, однако помогает программисту сделать код более понятным. Комментарии в C# бывают однострочными и многострочными. Однострочный комментарий начинается с символов //,  занимает одну строку и может размещаться на отдельной строке или после инструкции. Например, добавим в наше приложение однострочный комментарий:

using System;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!"); //выводим текст в консоль
        }
    }
}

здесь наш комментарий располагается сразу после инструкции. Если же нам необходимо добавить в исходный код большой объем текста, например, краткое описание программы, то мы можем использовать многострочный комментарий. Текст многострочного комментария располагается между символами /* */Например, добавим многострочный комментарий для нашего приложения:

/*
 Это приложение выводит строку "Hello, World!" в консоль
 и не использует операторы верхнего уровня
 */
using System;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!"); //выводим текст в консоль
        }
    }
}

Структура проекта C# в Visual Studio

Теперь посмотрим на структуру нашего проекта в Visual Studio. Структура проекта отображается в окне “Обозреватель решений”

Структура проекта на C#

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

Узел “Зависимости” содержит то, от чего зависит наш проект (без чего он не будет работать или будет работать некорректно. Например, если раскрыть этот узел, то можно увидеть, что наш проект не такой уж и пустой:

В этом же узле будут содержаться ссылки на другие проекты решения, подключаемые к проекту библиотеки сторонних компонентов и так далее. Добавить новую зависимость в проект можно с использованием контекстного меню узла “Зависимости” Корневой узел проекта (с названием приложения) также имеет свое контекстное меню, содержащее различные действия над проектом. Воспользуемся этим меню, чтобы перейти к следующей части – к файлу проекта C#.

Файл проекта C# (*.cproj)

Откройте контекстное меню проекта в обозревателе решений и выберите пункт “Изменить файл проекта”:

В редакторе кода откроется код файла проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>disable</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#

Эти и другие настройки проекта мы также можем увидеть, если выберем в контекстном меню проекта пункт “Свойства”:

Здесь все настройки проекта будут расположены на отдельной странице с пояснениями:

Подведем итог

Любая программа на C# имеет свою строго определенную структуру. Вначале файла располагаются директивы using для импорта в проект каких-либо компонентов, далее определяется пространство имен проекта внутри которого располагаются элементы программы, например, класс Program. Внутри класса определяются его члены, например, главный метод Main()– точка входа в приложение.

Домашнее задание №3

Создайте новый проект консольного приложения в Visual Studio без использования операторов верхнего уровня. Определите в этом проекте пространство имен с названием Welcome. Выведите в консоль приветствие (любую строку), предложите пользователю представиться и выведите его имя в консоль. Все инструкции кода сопроводите однострочными комментариями

Решение домашней работы можно изучить на странице домашних заданий.