Stanislav Gerasimov 23 ноября 2021

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

В этой статье мы познакомимся с C# и платформой .NET, рассмотрим базовые концепции языка и его кроссплатформенность, а также напишем несколько несложных программ, чтобы закрепить изученные основы синтаксиса на практике.
👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут
Язык программирования C# и платформа .NET Framework прошли долгий путь развития с 2002 года и сегодня считаются одним из самых перспективных инструментов разработчика. С выходом .NET Core 1/2/3 и .NET 5 началась новая эра разработки программных систем на языке C#. Основной упор был сделан на кроссплатформенность.

Установка .NET и инструментов разработки на C#

Установка в ОС Windows

Для подготовки рабочего окружения в Windows, необходимо скачать и установить полнофункциональную среду разработки – Microsoft Visual Studio Community 2019. Запускаем файл vs_community.exe и в окне мастера установки выбираем необходимые компоненты(включая .NET 5):

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

После завершения установки выбранных компонентов и базовой оболочки Visual Studio можно приступать к написанию приложений.

Больше полезной информации вы можете найти на нашем телеграм канале «Библиотека шарписта».

Установка в Linux (Ubuntu)

Платформу .NET можно использовать в популярных дистрибутивах Linux: например, в Ubuntu 20.04 LTS поддерживается SDK .NET 5.0/.NET Core 3.1 и среда выполнения ASP.NET Core. Их можно установить по инструкции с сайта Microsoft. В терминале для добавления репозитория введём следующие команды:

        wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

    

Установим .NET SDK 5, введя в терминале команду:

        sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

    

Среда выполнения ASP.NET Core устанавливается следующей командой:

        sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y aspnetcore-runtime-5.0

    

Завершающим этапом является установка редактора кода Microsoft Visual Studio Code: для этого нужно перейти на сайт и выбрать пакет с расширением .deb.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Запускаем и устанавливаем, после чего можно писать первую программу на C#. Для остальных дистрибутивов Linux все шаги сходны с точностью до используемой системы управления пакетами.

Установка в macOS

Платформа .NET и язык C# стали доступны и для операционной системы macOS. Также по аналогии с Windows была выпущена интегрированная среда разработки – Microsoft Visual Studio for Mac. Скачаем Visual Studio for Mac 2019.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Монтируем образ VisualStudioforMacInstaller.dmg и запускаем программу установки двойным щелчком:

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Принимаем лицензионное и выбираем необходимые компоненты (.NET Core):

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Нажимаем кнопку Install и ожидаем завершения работы установщика. Подробнее ознакомиться с инструкцией можно на сайте Microsoft.

Создание и запуск первого проекта

ОС Windows

В Windows запускаем Microsoft Visual Studio 2019 из меню Пуск и выбираем “Создание проекта”.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

В следующем окне в качестве типа проекта выберем Console App (Консольное приложение) на языке C#.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

На следующем шаге указываем имя и расположение проекта.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Выбираем необходимую версию .NET и создадим проект, щёлкнув кнопку Создать.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

После успешного создания проекта, откроется основное рабочее окно Visual Studio 2019. Оно состоит из трёх панелей: редактор кода, обозреватель проекта (решения) и свойства.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Структура проекта состоит из файла Program.cs и зависимостей, в редакторе кода открыто его содержимое.

Программа простая, но выполняет вывод строки. Для её компиляции и запуска нажимаем клавишу F5 или на зеленую стрелку.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

При успешном запуске программы в консольном окне выводится Hello World!.

Linux/Ubuntu

Создадим проект консольного приложения .NET – FirstApp в Visual Studio Code, для этого выберем Файл -> Открыть папку, далее в появившемся окне создадим папку FirsrApp и щелкнем Выбрать папку.

Откроем терминал в Visual Studio Code, выбрав Вид -> Терминал. В окне терминала введём следующую команду:

        dotnet new console --framework net5.0
    

Она создает простое приложение FirstApp и класс Program с методом Console.WriteLine(String) для вывода "Hello World!" в окне консоли.

Для запуска приложения в терминале вводим команду.

        dotnet run
    

В терминале после её выполнения будет выведена строка Hello World!.

Apple macOS

Запустим Visual Studio for Mac 2019 и щелкнем пункт New (Создать).

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

В разделе Web and Console (Интернет и Консоль) диалогового окна создания проекта выберем тип Приложение. Выберите шаблон Консольное приложение и нажмите кнопку Далее.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Вводим название проекта и щелкаем по кнопке Create (Создать).

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Консольное приложение успешно создано: как и ранее оно содержит класс Program с точкой входа Main и методом Console.WriteLine(“Hello World!”);.

👨‍🎓️ Самоучитель по C# для начинающих. Часть 1: установите среду разработки и освойте основы языка за 30 минут

Запустим приложение, нажав на чёрную стрелку или комбинацию клавиш Option+Command+Enter.

Структура программы

В предыдущем разделе, мы создали простейшее приложение, которое выводит строку Hello World! и запустили на различных операционных системах. Рассмотрим подробнее структуру программы в файле Program.cs.

        using System; 

namespace FirstApp
{
    /*Моя первая программа.*/
    class Program
    {
        static void Main(string[] args) // Метод Main - точка входа в приложение
        {
            Console.WriteLine("Hello World!"); // WriteLine - выводит строку
        }
    }
}

    

Разберем построчно исходный код:

  • using System – подключает пространство имен System с библиотекой классов.
  • namespace FirstApp является контейнером для классов в рамках приложения, объединяя их в одно пространство имён.
  • Фигурные скобки {} обозначают начало и конец блока кода.
  • class Program – класс с данными и методами, который привносит функциональность в программу. Каждая строка исполняемого кода на C# должна находиться внутри класса. В нашем случае класс имеет имя Program.
  • Код внутри метода Main будет выполняться первым, этот метод является точкой входа в приложение.
  • Console – класс пространства имен System, имеющий метод WriteLine(), который используется для вывода текста. У нас будет выведена строка «Hello World!».
  • Если опустить строку using System, то придется писать System.Console.WriteLine() для вывода текста.
Примечание
Каждый оператор C # заканчивается точкой с запятой ; , к тому же язык чувствителен к регистру: «MyClass» и «myclass» имеют разное значение.
  • Ещё одним немаловажным блоком кода являются комментарии: они бывают многострочными и однострочными, а задаются символами /**/ и // соответственно.

Переменные и типы данных

Переменные служат для хранения данных и операций над ними. Объявлять переменные можно используя классический синтаксис: тип имя = значение;

        int number = 10;
    

Поддерживается интерференция типов: компилятор C# способен автоматически определять тип переменной, используя ключевое слово var.

        var number = 9;
    

Для объявления констант добавляется ключевое слово const и их значения остаются фиксированными во время выполнения программы.

        const int sizeArr = 10;
    

C# имеет следующие базовые типы: int, double, string, char, bool, float, long. Остановимся на базовых типах для простоты понимания фундамента языка.

Консольный ввод и вывод

Используя Console.WriteLine можно вывести информацию или значения переменных на экран.

        string manufactuer = "Tesla";
string model = "Model S";
int price = 6390000;

Console.WriteLine("Электромобили наше будущее!");
Console.WriteLine(manufactuer + " - " + model);
Console.WriteLine("Цена: " + price);
    

После вывода каждой строки перемещаемся на новую строку, а для вывода в одну строку используется метод Console.Write().

Зачастую необходимо вывести значения с форматированием строки для более наглядного результата.

        Console.Write($"Производитель: {manufactuer}  Модель: {model}  Цена: {price} руб");
    

В консоль будет выведена уже форматированная строка.

Для ввода информации с клавиатуры в C# используется метод Console.ReadLine().

        Console.Write("Как вас зовут? ");
string nane = Console.ReadLine();
Console.WriteLine("Ваше имя: " + nane);
    

Этот метод считывает строку в консоли и возвращает её в приложение. Для ввода значений других типов преобразуем строку используя Convert.ToType(), где Type необходимый нам тип.

        Console.Write("Введите модель авто: ");
string model = Console.ReadLine();

Console.Write("Введите вес: ");
double massa = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите кол.дверей: ");
int doorCount = Convert.ToInt32(Console.ReadLine());

Console.Write("Введите цену: ");
decimal price = Convert.ToDecimal(Console.ReadLine());
Console.WriteLine($"Модель:{model}  Вес:{massa}т  Дверей:{doorCount} Цена: {price}Р");

    

Для приведения строк вес, количество дверей и цена в нужный нам тип, используем Convert.ToDouble(), Convert.ToInt32() и Convert.ToDecimal() соответственно. Подробнее о приведении типов в разделе Преобразовании типов.

Базовые операторы

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

Арифметические операторы

Операторы +, -, *, /, %, ++, -- используются в основном для работы с числовыми переменными, объектами.

        int a = 8, b = 4;

Console.WriteLine($"a + b = {a + b}");
Console.WriteLine($"a - b = {a - b}");
Console.WriteLine($"a * b = {a * b}");
Console.WriteLine($"a / b = {a / b}");
Console.WriteLine($"a % b = {a % b}");

    

По каждой операции будет выведен соответствующий результат.

Операторы присваивания

Операторы присваивания используются, чтобы задать значения переменных.

        int a = 8;

a += 2;
a -= 2;
a *= 2;
a /= 2;
a %= 2;

    

Операторы сравнения

Операторы сравнения используются для сравнения двух значений и возвращают значение типа bool (логическое значение).

        bool condition1 = a == b;
bool condition2 = a != b;
bool condition3 = a > b;
bool condition4 = a < b;
bool condition5 = a >= b;
bool condition6 = a <= b;

    

Логические операторы

Здесь все стандартно и привычно, если вы имели дело с C-подобными языками.

        int a = 4;
Console.WriteLine(a > 2 && a < 5);
Console.WriteLine(a > 1 || a < 3);
Console.WriteLine(!(a > 2 && a < 5));

    

В языке C# существуют и другие операторы, рассмотрим их позже по мере необходимости.

Управление потоком

В программировании задачи и алгоритмы часто требуют принятия решений и выполнение кода при определенных условиях (conditions).
  • Если необходимо выполнить код по условию, для этого используются инструкции: if, else, ternary operation, switch.
  • Для многократного выполнения инструкций применяются циклы: for, foreach, while, break-continue.

If…else

Инструкция if…else в стандартной форме выглядит так:

        if (condition)
{
    // 
}
else
{
    //
}

    

По условию поток передается определенным блокам кода. При истинности условия (true), выполняется код в if {…}, а когда условие ложно (false), выполняется код в else {…}.

        string name = Console.ReadLine();

if(name != "")
{
    Console.WriteLine(name);
}
else
{
    name = "Антон";
    Console.WriteLine(name);
}

    

if…

Если требуется выполнить только условие, то else можно опустить.

        int x = 0;

if(x == 0)
{
    x = 5;
}

    

Как видно из примера, переменная получает новое значение, если она равна нулю.

if...else if...else

Можно добавить if после else и комбинировать их:

        string modelPhone = Console.ReadLine();
string manufactPhone = "";

if (modelPhone == "IPhone X")
{
    manufactPhone = "Apple";
    Console.WriteLine(manufactPhone + " " + modelPhone);
}
else if (modelPhone == "Honor 10")
{
    manufactPhone = "Huawei";
    Console.WriteLine(manufactPhone + " " + modelPhone);
}
else
{
    Console.WriteLine("No phone!");
}

    

Тернарная операция (Ternary operation)

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

        int a = 10;
int b = 7;

int c = a < b ? (a - b) : (a + b);
Console.WriteLine(c);

    

switch

Для выбора одного из множества блоков кода используется оператор switch.

        int x = Convert.ToInt32(Console.ReadLine());

switch (x)
{
      case 1:
           Console.WriteLine("One");
           break;
     case 2:
          Console.WriteLine("Two");
          break;
    default:
          Console.WriteLine("Other number!");
          break;
    }
}

    

Шаблон, с которым сравнивается значение x определяется ключевым словом case. Далее по успешному совпадению с шаблоном, выполняется соответствующий блок кода. Если совпадений нет, то исполняется блок default для остальных случаев.

Цикл for

Цикл for в основном используется для перебора значений по условию с одновременным выполнением операций и имеет вид:

        for(start; condition; step) 
{
       // блок выполняемого кода
}

    

Рассмотрим работу цикла на примере вычисления таблицы умножения.

        for(int i = 1; i < 10; i++)
{
    Console.WriteLine($"{i} * {i} = {i * i}");
}

    

Цикл начинает выполняться со значения переменной i = 1 до 9, увеличивая её на единицу i++ (инкремент), каждая итерация вычисляет умножение числа само на себя, в итоге выводится таблица умножения.

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

Цикл foreach

Также существует цикл foreach, который используется исключительно для циклического перебора элементов массива (смотрим раздел Массивы):

        foreach (type variable in array) 
{
  // блок выполняемого кода
}

    

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

        string str_hello = "Hello World!";

foreach(char ch in str_hello)
{
    Console.WriteLine(ch);
}

    

Строка представляет собой массив символов, используя переменную char ch, цикл перебирает и выводит все символы строки.

Цикл while

Цикл while выполняет перебор, пока заданное условие истинно и имеет такой синтаксис:

        while (condition) 
{
  // блок выполняемого кода
}

    

Таблица умножения в этом цикле, реализуется также просто.

        int n = 1;

while(n < 10)
{
    Console.WriteLine($"{n}*{n} = {n*n}");
    n++;
}

    

Цикл do / while ещё вариант цикла while, он выполняет блок кода один раз, прежде чем проверить истинность условия, а затем повторяет итерации, пока условие истинно. Синтаксис такого цикла выглядит так:

        do 
{
  // блок выполняемого кода
}
while (condition);

    

В качестве примера рассмотрим вычисление суммы чисел отличных от нуля, если вводится 0, то цикл завершается и выводится сумма.

        int n; 
int sum = 0; 

do
{ 
     Console.Write("Введите число: ");
     n = Int32.Parse(Console.ReadLine());

     sum += n;
} while (n != 0);

    Console.WriteLine("Сумма = {0}", sum);
    

break/continue

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

        for (int i = 0; i < 20; i++) 
{
       if(i==10)
       {
           continue;
       }
       else if(i==17)
       {
           break;
       }

    

Из примера видно, что если i=10, то цикл продолжает работу, если i=17, то оператор break завершает цикл.

Массивы

Переменная является единичной именованной областью памяти, но как быть, если требуется несколько таких переменных одного типа? Для этого используются одномерные и многомерные массивы

Одномерные массивы

Одномерный массив состоит из однотипных N-элементов и синтаксис его объявления следующий:

        type [] nameArr;
    

Для использования массива, необходимо задать его размер, делаем так:

        type [] nameArr = new type [N];
    

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

        string[] phones = {"IPhone 6S", "IPhone 8", "IPhone X", "IPhone 12 Pro"};

    

Также можно создать массив с числами, предлагаю поэкспериментировать самостоятельно.

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

        string[] phones = {"IPhone 6S", "IPhone 8", "IPhone X", "IPhone 12 Pro"};

Console.WriteLine(phones[0]);
Console.WriteLine(phones[3]);

for(int i = 0; i < phones.Length; i++)
{
    Console.WriteLine($"[{i}] = {phones[i]}");
}

    

По индексам 0 и 3, будут выведены первый и последний элементы массива, в цикле перебираются и выводятся все его элементы. Если нужно изменить элемент массива, это делается также с использованием индекса.

Например, если вместо IPhone X нужно внести IPhone 11, то по индексу 2 просто изменяем значение.

        string[] phones = {"IPhone 6S", "IPhone 8", "IPhone X", "IPhone 12 Pro"};

for (int i = 0; i < phones.Length; i++)
 {
      if (i == 2)
      {
          phones[i] = "IPhone 11";
      }
      Console.WriteLine($"[{i}] = {phones[i]}");
}

    

В результате выполнения кода будет выведен обновленный массив.

Многомерные массивы

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

Двумерные и N-мерные массивы позволяют хранить и обрабатывать многомерные данные. Синтаксис объявления таких массивов следующий:

        type[,] arrName;

    

Запятая в фигурных скобках указывает на многомерность массива, а его размер задается так:

type[,] arrName = new type[N, M];

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

        int[,] MatrixA = new int[3,3] { {1, 2, 3}, {4, 5, 6}, {7,  8, 9} };
int[,] MatrixB = new int[3, 3] { { 3, 2, 1 }, { 6, 5, 4 }, { 9, 8, 7 } };
int[,] resultMatrix = new int[3, 3];

for(int i = 0; i < 3; i++)
{
    for(int j = 0; j < 3; j++)
    {
        resultMatrix[i, j] = MatrixA[i, j] * MatrixB[i, j];
        Console.Write(resultMatrix[i, j] + " ");
    }
        Console.WriteLine("");
}

    

Как видно из примера, мы создали два массива размером 3х3 с числами результирующий массив – resultMatrix. Для прохода по столбцам и строкам массивов, используются два цикла for.

На этом с массивами заканчиваем и более подробно поговорим о них и структурах данных в следующих частях.

Методы (функции)

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

В нашей первой программе имеется пользовательский метод Main() – главный метод, а методы WriteLine() и ReadLine() являются библиотечными.

Метод – это блок кода, который выполняет определённые задачи и запускается только при его вызове.

Методы бывают с параметрами и без параметров, то есть могут принимать или не принимать данные, а также возвращать результат или только выполнять действия. Объявление метода выглядит следующим образом:

static type MethodName() {

........

}

Где MethodName () – это имя метода, а static означает, что метод принадлежит классу Program, а не объекту класса Program.

Об объектах и о том, как получить доступ к методам через объекты мы узнаем в следующей части цикла.

void означает, что этот метод не имеет возвращаемого значения.

void-методы

Рассмотрим пример создания и использования невозвращаемого метода без параметров и с параметрами.

        static void Main(string[] args) // Метод Main - точка входа в приложение
{
	string name = “Michael”;

        Hello();
        AreaQvadrata(a);
}

static void Hello()
{
      Console.WriteLine("Hello Method!");
}

static void HelloName(string input)
{
      Console.WriteLine("Hello, " + input);
}

    

Методы Hello() и HelloName(string input) вызываются в основном методе Main(), первый без параметров, а второй принимает строку и выводит уже Hello, Name.

return-методы

Методы с возвращаемым значением, как правило объявляются с указанием его типа. Рассмотрим пример вычисления суммы и произведения чисел.

        static void Main(string[] args) // Метод Main - точка входа в приложение
{
     int a = 4, b = 5;

     int res = Sum(a, b);
     Console.WriteLine(res);

}

 static int Sum(int a, int b)
 {
    return a + b;
 }

    

Метод Sum получает в качестве параметров 2 числа и с помощью оператора return возвращает их сумму.

***

На этом мы завершаем первую часть цикла по основам C#. В следующих выпусках самоучителя разберем более сложные темы. Удачи в освоении одного из популярных языков программирования!

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Junior QA engineer
Самара, от 45000 RUB до 65000 RUB
QA Инженер
Санкт-Петербург, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ