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

После завершения установки выбранных компонентов и базовой оболочки 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#. Для остальных дистрибутивов Linux все шаги сходны с точностью до используемой системы управления пакетами.
Установка в macOS
Платформа .NET и язык C# стали доступны и для операционной системы macOS. Также по аналогии с Windows была выпущена интегрированная среда разработки – Microsoft Visual Studio for Mac. Скачаем Visual Studio for Mac 2019.

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

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

Нажимаем кнопку Install
и ожидаем завершения работы установщика. Подробнее ознакомиться с инструкцией можно на сайте Microsoft.
Создание и запуск первого проекта
ОС Windows
В Windows запускаем Microsoft Visual Studio 2019 из меню Пуск и выбираем “Создание проекта”.

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

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

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

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

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

При успешном запуске программы в консольном окне выводится 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 (Создать).

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

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

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

Запустим приложение, нажав на чёрную стрелку или комбинацию клавиш 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()
для вывода текста.
;
, к тому же язык чувствителен к регистру: «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# существуют и другие операторы, рассмотрим их позже по мере необходимости.
Управление потоком
- Если необходимо выполнить код по условию, для этого используются инструкции: 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 = Convert.ToInt32(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;
}
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-методы
Рассмотрим пример создания и использования невозвращаемого метода без параметров и с параметрами.
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#. В следующих выпусках самоучителя разберем более сложные темы. Удачи в освоении одного из популярных языков программирования!
Комментарии
Спасибо за самоучитель! Очень помог
Я вообще ни чего не понял что прочитал...
Молодец, продолжай идти к цели!
Спасибо!
Станислав, Вы заведомо делаете код не особо чистым, во-первых вы получите экскпшены, когда забираете числа с консоли разных типов, если пользователь введёт строку, хотя Вы знаете что такое int.TryParse. Во-вторых if(i==10) { continue; } else if(i==17) { break; } Вот это вообще никуда не годится. Зачем делать else? Здесь должно быть два if If(i==10) continue;
If(i==17) break;
В целом много замечаний по коду, Вы давно знакомы с языком?
Кратко и понятно. Когда вторая часть?))
Пока не знаю, так как работаю с другим стеком сейчас. Может быть к НГ