Как программировать на C#: обзор языка, примеры кода, базовые инструменты

s_cover1
Почему стоит изучить язык для веб-приложений и геймдева

От простой формы регистрации до алгоритма машинного обучения, от тетриса до 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# — объектно-ориентированный язык, он сделан так, чтобы работать с кодом было проще. Код делится на фрагменты (объекты), каждый из которых можно редактировать и улучшать, не переписывая при этом весь остальной код.

Кроме того, в 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;
}
Так выглядит изнутри реализация простой и короткой команды .sort. Источник

У 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");
}
Так выглядит одна и та же команда на языках Python и C#

Сейчас язык 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#. На этой площадке можно писать код и разворачивать приложения. Встроенный функционал проверяет код и подсказывает, если вы совершили ошибку, выдает справочную информацию, если вы что-то забыли.

Так выглядит интерфейс среды разработки Visual Studio. Источник

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#, в которой описаны все тонкие моменты языка. Будьте осторожны, с нее лучше не начинать, иначе можно испугаться и бросить.

Курсы по теме

(рейтинг: 5, голосов: 1)
Добавить комментарий