Выбрать главу

Язык C# требует, чтобы вся логика программы содержалась внутри определения типа (вспомните из главы 1, что тип — это общий термин, относящийся к любому члену из множества {класс, интерфейс, структура, перечисление, делегат}). В отличие от многих других языков программирования создавать глобальные функции или глобальные элементы данных в C# невозможно. Взамен все данные-члены и все методы должны находиться внутри определения типа. Первым делом создадим новое пустое решение под названием Chapter3_AllProject.sln, которое содержит проект консольного приложения по имени SimpleCSharpApp.

Выберите в Visual Studio шаблон Blank Solution (Пустое решение) в диалоговом окне Create a new project (Создание нового проекта). После открытия решения щелкните правой кнопкой мыши на имени решения в окне Solution Explorer (Проводник решений) и выберите в контекстном меню пункт AddNew Project (Добавить►Новый проект). Выберите шаблон ConsoleАрр (.NET Core) (Консольное приложение (.NET Core)) на языке С#, назначьте ему имя SimpleCSharpApp и щелкните на кнопке Create (Создать). Не забудьте выбрать в раскрывающемся списке Target framework (Целевая инфраструктура) вариант .NET 5.0.

Введите в окне командной строки следующие команды:

dotnet new sin -n Chapter3_AllProjects

dotnet new console -lang c# -n SimpleCSharpApp

  -o .\SimpleCSharpApp -f net5.0

dotnet sin .\Chapter3_AllProjects.sin add .\SimpleCSharpApp

Наверняка вы согласитесь с тем, что код в первоначальном файле Program.cs не особо примечателен:

using System;

namespace SimpleCSharpApp

{

  class Program

  {

    static void Main(string[] args)

    {

      Console.WriteLine("Hello World!");

    }

  }

}

Теперь модифицируем метод Main() класса Program следующим образом:

class Program

{

  static void Main(string[] args)

  {

    // Вывести пользователю простое сообщение.

    Console.WriteLine("***** My First C# App *****);

    Console.WriteLine("Hello World!");

    Console.WriteLine();

    // Ожидать нажатия клавиши <Enter>, прежде чем завершить работу.

    Console.ReadLine();

  }

}

На заметку! Язык программирования C# чувствителен к регистру. Следовательно, Main — не то же, что main, a Readline — не то же, что ReadLine. Запомните, что все ключевые слова C# вводятся в нижнем регистре (например, public, lock, class, dynamic), в то время как названия пространств имен, типов и членов (по соглашению) начинаются с заглавной буквы и имеют заглавные буквы в любых содержащихся внутри словах (скажем, Console.WriteLine, System.Windows.MessageBox, System.Data.SqlClient). Как правило, каждый раз, когда вы получаете от компилятора сообщение об ошибке, касающееся неопределенных символов, то в первую очередь должны проверить правильность написания и регистр.

Предыдущий код содержит определение типа класса, который поддерживает единственный метод по имени Main(). По умолчанию среда Visual Studio назначает классу, определяющему метод Main(), имя Program; однако при желании его можно изменить. До выхода версии C# 9.0 каждое исполняемое приложение C# (консольная программа, настольная программа Windows или Windows-служба) должно было содержать класс, определяющий метод Main(), который использовался для обозначения точки входа в приложение.

Выражаясь формально, класс, в котором определен метод Main(), называется объектом приложения. В одном исполняемом приложении допускается иметь несколько объектов приложений (что может быть удобно при модульном тестировании), но тогда вы обязаны проинформировать компилятор о том, какой из методов Main() должен применяться в качестве точки входа. Это можно делать через элемент <StartupObject> в файле проекта или посредством раскрывающегося списка Startup Object (Объект запуска) на вкладке Application (Приложение) окна свойств проекта в Visual Studio.

Обратите внимание, что сигнатура метода Main() снабжена ключевым словом static, которое подробно объясняется в главе 5. Пока достаточно знать, что статические члены имеют область видимости уровня класса (а не уровня объекта) и потому могут вызываться без предварительного создания нового экземпляра класса.

Помимо наличия ключевого слова static метод Main() принимает единственный параметр, который представляет собой массив строк (string[] args). Несмотря на то что в текущий момент данный массив никак не обрабатывается, параметр args может содержать любое количество входных аргументов командной строки (доступ к ним будет вскоре описан). Наконец, метод Main() в примере был определен с возвращаемым значением void, т.е. перед выходом из области видимости метода мы не устанавливаем явным образом возвращаемое значение с использованием ключевого слова return.