От простой формы регистрации до алгоритма машинного обучения, от тетриса до VR-игр на движке Unity — все эти программы можно написать на языке C#. Созданный компанией Microsoft язык пережил пик популярности в 2012 году, но не потерял актуальность до сих пор, продолжает бурно развиваться и обновляться каждый год. Вместе с backend-разработчиком Logrus IT Федором Мальцевым разбираемся, что из себя представляет C# и какие возможности он открывает программисту.
C# — язык веб-приложений и геймдева
C# — это язык программирования, разработанный компанией Microsoft, чтобы создавать приложения для Windows. Сегодня C# стал кроссплатформенным, на нем можно писать программы как для Windows, так и для iOS и Linux.
Язык используется в backend-разработке веб-приложений: в работе с базами данных и сетью, в программировании логики и так далее. Программисты C# востребованы в банках, небольших компаниях и стартапах, мобильной разработке. C# пригодится тем, кто планирует создавать видеоигры и VR-приложения на популярном движке Unity или работать с алгоритмами машинного обучения.
using System;
using System.Linq;
using System.Drawing;
using System.Windows.Forms;
namespace LittleTetris{
public partial class Form1 : Form{
public const int width = 15, height = 25, k = 15;
public int[,] shape = new int[2, 4];
public int[,] field = new int[width, height];
public Bitmap bitfield = new Bitmap(k * (width + 1) + 1, k * (height + 3) + 1);
public Graphics gr;
public Form1(){
InitializeComponent();
gr = Graphics.FromImage(bitfield);
for (int i = 0; i < width; i++)
field[i, height - 1] = 1;
for (int i = 0; i < height; i++) {
field[0, i] = 1;
field[width - 1, i] = 1;
}
SetShape();
}
public void FillField(){
gr.Clear(Color.Black);
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
if (field[i, j] == 1){
gr.FillRectangle(Brushes.Green, i * k, j * k, k, k);
gr.DrawRectangle(Pens.Black, i * k, j * k, k, k);
}
for (int i = 0; i < 4; i++){
gr.FillRectangle(Brushes.Red, shape[1, i] * k, shape[0, i] * k, k, k);
gr.DrawRectangle(Pens.Black, shape[1, i] * k, shape[0, i] * k, k, k);
}
FieldPictureBox.Image = bitfield;
}
private void TickTimer_Tick(object sender, System.EventArgs e){
if (field[8, 3] == 1)
Environment.Exit(0);
for (int i = 0; i < 4; i++)
shape[0, i]++;
for (int i = height - 2; i > 2; i--){
var cross = (from t in Enumerable.Range(0, field.GetLength(0)).Select(j => field[j, i]).ToArray() where t == 1 select t).Count();
if (cross == width)
for (int k = i; k > 1; k--)
for (int l = 1; l < width - 1; l++)
field[l, k] = field[l, k - 1];}
if (FindMistake()){
for (int i = 0; i < 4; i++)
field[shape[1, i], --shape[0, i]]++;
SetShape();}
FillField();
}
private void Form1_KeyDown(object sender, KeyEventArgs e){
switch (e.KeyCode){
case Keys.A:
for (int i = 0; i < 4; i++)
shape[1, i]--;
if (FindMistake())
for (int i = 0; i < 4; i++)
shape[1, i]++;
break;
case Keys.D:
for (int i = 0; i < 4; i++)
shape[1, i]++;
if (FindMistake())
for (int i = 0; i < 4; i++)
shape[1, i]--;
break;
case Keys.W:
var shapeT = new int[2, 4];
Array.Copy(shape, shapeT, shape.Length);
int maxx = 0, maxy = 0;
for (int i = 0; i < 4; i++){
if (shape[0, i] > maxy)
maxy = shape[0, i];
if (shape[1, i] > maxx)
maxx = shape[1, i];
}
for (int i = 0; i < 4; i++) {
int temp = shape[0, i];
shape[0, i] = maxy - (maxx - shape[1, i]) - 1;
shape[1, i] = maxx - (3 - (maxy - temp)) + 1;
}
if (FindMistake())
Array.Copy(shapeT, shape, shape.Length);
break;
}
}
public void SetShape(){
Random x = new Random(DateTime.Now.Millisecond);
switch (x.Next(7)){
case 0: shape = new int[,] { { 2, 3, 4, 5 }, { 8, 8, 8, 8 } }; break;
case 1: shape = new int[,] { { 2, 3, 2, 3 }, { 8, 8, 9, 9 } }; break;
case 2: shape = new int[,] { { 2, 3, 4, 4 }, { 8, 8, 8, 9 } }; break;
case 3: shape = new int[,] { { 2, 3, 4, 4 }, { 8, 8, 8, 7 } }; break;
case 4: shape = new int[,] { { 3, 3, 4, 4 }, { 7, 8, 8, 9 } }; break;
case 5: shape = new int[,] { { 3, 3, 4, 4 }, { 9, 8, 8, 7 } }; break;
case 6: shape = new int[,] { { 3, 4, 4, 4 }, { 8, 7, 8, 9 } }; break;
}
}
public bool FindMistake(){
for (int i = 0; i < 4; i++)
if (shape[1, i] >= width || shape[0, i] >= height ||
shape[1, i] <= 0 || shape[0, i] <= 0 ||
field[shape[1, i], shape[0, i]] == 1)
return true;
return false;
}
}
}

Чем хорош язык C#
C# — объектно-ориентированный язык, он сделан так, чтобы работать с кодом было проще. Код делится на фрагменты (объекты), каждый из которых можно редактировать и улучшать, не переписывая при этом весь остальной код.
Кроме того, в C# есть много функционала, который уже реализован — просто берите его и используйте. Например, если вам нужен алгоритм сортировки, можно не писать его с нуля, он уже есть. Достаточно написать команду “.sort” — и все отсортировано.
private void QuickSort(int[] arr, int start, int end)
{
int i;
if (start < end)
{
i = Partition(arr, start, end);
QuickSort(arr, start, i - 1);
QuickSort(arr, i + 1, end);
}
}
private int Partition(int[] arr, int start, int end)
{
int temp;
int p = arr[end];
int i = start - 1;
for (int j = start; j <= end - 1; j++)
{
if (arr[j] <= p)
{
i++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
temp = arr[i + 1];
arr[i + 1] = arr[end];
arr[end] = temp;
return i + 1;
}
У C# синтаксис проще, чем, например, у Python. В нем есть фигурные скобки, которые размечают блоки кода. В результате воспринимать такой код легче. C# — неплохой язык для начинающих, изучить его будет проще, чем тот же C++. Если же вы раньше имели дело с C-подобными языками, то будет еще легче, синтаксис окажется для вас очень знакомым.
Python:
if daytime == "morning":
print("Good")
print("Morning")
else:
print("Good evening")
C#:
if (daytime == "morning")
{
Print(“Good");
Print(“Morning");
}
else
{
Print(“Good evening");
}
Сейчас язык C# стал опенсорсным: каждый может внести в него свой вклад, но Microsoft при этом сохраняет контроль, поддерживает философию продукта, выбирает лучшие предложения. Обновление языка происходит раз в год.
Читайте также: Чем занимается программист игр на Unity и C#?
Востребован ли C#
Весной 2022 года на hh.ru размещены более 1700 вакансий C#-разработчиков по всей России. Организация контроля качества кода TIOBE в мае 2022-го включила C# в топ-5 самых популярных языков программирования и отметила его бурный рост.
Востребованность языка подтверждают и зарплаты специалистов по C#. За второе полугодие 2021-го, по данным Habr, средняя оплата труда разработчика на C# выросла на 11% и составляет 150 тыс. рублей.
Инструменты для работы с C#
Чтобы работать с C#, вам понадобятся следующие инструменты.
Visual Studio — среда разработки, созданная специально для C#. На этой площадке можно писать код и разворачивать приложения. Встроенный функционал проверяет код и подсказывает, если вы совершили ошибку, выдает справочную информацию, если вы что-то забыли.

ASP.NET — фреймворк для веб-разработки на C#, который позволяет быстро и просто связывать серверную часть приложения с клиентской.
WPF (Windows Presentation Foundation) — софт для программирования графических интерфейсов для разных экранов.
LINQ (Language Integrated Query) — встроенный в C# язык запросов, напоминающий SQL. Помогает работать с данными из разных источников, сортировать и группировать их.
Entity Framework — фреймворк, который позволяет работать с данными как с объектами и использовать для запросов язык LINQ.
С чего начать изучение C#
Руководство по C# и Visual Studio от Microsoft — упорядоченная официальная документация от компании-разработчика с примерами кода, инструкцией, как создать первое приложение на C#, и учебниками.
Поток C# на Хабре — новости и кейсы от разработчиков.
Поток C# на сайте Metanit — очень понятное объяснение практически всех основных тем с примерами кода
DotNetRu — YouTube-канал на русском с подкастами и докладами с конференций.
Книга Эндрю Стиллмена «Head first C#» — хорошая книга для начинающих, которая не задавит сложной информацией и даст все необходимое. Дополнить можно справочником по C# Бена и Джозефа Албахари.
Книга Джеффри Рихтера «CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#» — библия C#, в которой описаны все тонкие моменты языка. Будьте осторожны, с нее лучше не начинать, иначе можно испугаться и бросить.