C#: ключевые понятия языка, .NET MAUI и Xamarin разработка

Автор: IT Sectr Опубликовано: 2026-02-10 Время чтения: 12 мин

C# — современный объектно-ориентированный язык программирования от Microsoft, являющийся основой для платформ Xamarin и .NET MAUI в мобильной разработке. Благодаря единой экосистеме .NET разработчики могут создавать мобильные приложения для iOS и Android, используя общий код на C# и XAML. По данным индекса TIOBE (2026), C# занимает 4-е место по популярности среди всех языков программирования. Подробнее — в документации Microsoft C#.

Главное

  • C# — объектно-ориентированный язык от Microsoft для .NET-платформы
  • .NET MAUI — преемник Xamarin, единый проект для iOS, Android, Windows, macOS
  • XAML — декларативная разметка UI, общая для всех платформ .NET
  • CLR — Common Language Runtime с JIT/AOT компиляцией и сборкой мусора
  • LINQ — Language Integrated Query для работы с коллекциями и БД

Что такое C#?

C# (произносится «си шарп») — объектно-ориентированный язык программирования с безопасной системой типов, разработанный Microsoft в 2000 году под руководством Андерса Хейлсберга. Название вдохновлено музыкальной нотацией (диез — повышение тона). C# работает на платформе .NET, которая включает Common Language Runtime (CLR) и обширную библиотеку классов (BCL — Base Class Library).

В мобильной разработке C# используется через две технологии: Xamarin (2011–2024) и его преемника .NET MAUI (2022+). Xamarin позволял создавать нативные Android и iOS приложения с общим C#-кодом, разделяя платформенные проекты. .NET MAUI объединяет все платформы в один проект с общей XAML-разметкой и доступом к нативным API через платформенные интерфейсы.

Ключевая особенность C# — строгая статическая типизация с возможностью динамической диспетчеризации через dynamic, ключевое слово var (вывод типа) и мощную систему дженериков. C# — fully managed язык: память управляется сборщиком мусора (GC), границы массивов проверяются, неинициализированные переменные запрещены. Это делает C# безопаснее C++ при сопоставимой производительности через AOT-компиляцию.

Версии C# и эволюция

C# 1.0 (2000) — базовый ООП-язык. C# 3.0 (2007) — LINQ, лямбда-выражения, extension methods. C# 6.0 (2015) — string interpolation, null-conditional operator. C# 8.0 (2019) — nullable reference types (включение нулевой безопасности), async streams, default interface methods. C# 10 (2021) — global usings, file-scoped namespaces, record struct. C# 12 (2023) — primary constructors, collection expressions, interceptors. Каждая версия привносит улучшения, релевантные для мобильной разработки.

Версия C#ГодКлючевая фичаЗначение для мобильной разработки
3.02007LINQ, лямбдыУпрощённая работа с коллекциями и БД
6.02015?. (null-conditional), string interpolationБезопасный доступ к свойствам, читаемые строки
8.02019Nullable reference types, async streamsNull safety, асинхронные потоки данных
102021Record struct, global usingsValue-типы, сокращение boilerplate
122023Primary constructors, collection expressionsЛаконичная запись классов и коллекций

Синтаксис C#: типы, классы и LINQ

Синтаксис C# — C-подобный, строго типизированный. Всё является объектом, включая примитивы (int, double, bool — это структуры, наследующие ValueType). C# делит типы на value types (int, double, bool, struct, enum — хранятся на стеке) и reference types (string, class, interface, delegate, array, record — хранятся в куче). Nullable-типы (int?) разрешают null для value types.

Типы данных и классы

C# поддерживает классы (class), структуры (struct), записи (record), интерфейсы (interface), перечисления (enum) и делегаты (delegate). record — иммутабельный reference type с value-based равенством (два record равны, если все их поля равны). record struct — value-версия record, введённая в C# 10. primary constructors (C# 12) объединяют объявление и инициализацию в одну строку.

csharp
// Базовые типы и классы C#
using System;
using System.Collections.Generic;

// Record с primary constructor (C# 12)
public record User(int Id, string Name, string Email);

// Класс с nullable-свойствами
public class AppConfig
{
    public string AppName { get; init; }
    public string? ApiUrl { get; set; } // nullable reference type
    public int Version { get; init; }

    // Метод с expression body
    public string GetDisplayName() => $"{AppName} v{Version}";
}

// Extension method
public static class StringExtensions
{
    public static bool IsValidEmail(this string email) =>
        email.Contains("@") && email.Contains(".");
}

// Использование
var user = new User(1, "Alice", "alice@example.com");
bool validEmail = user.Email.IsValidEmail();

Record User с primary constructor автоматически генерирует equals, hashCode, ToString, Deconstruct и with-копирование. init-only сеттеры (AppName) позволяют установить значение только в инициализаторе. Expression body (=>) — лаконичная запись для простых методов. Extension method IsValidEmail добавляет метод к string без наследования.

LINQ — Language Integrated Query

LINQ — встроенный язык запросов к коллекциям, базам данных, XML. LINQ to Objects — запросы к IEnumerable коллекциям. LINQ to SQL — к БД. LINQ to XML — к XML. Синтаксис бывает query (from u in users where u.Age > 18 select u) и method (users.Where(u => u.Age > 18).Select(u => u)). Ленивая загрузка (deferred execution): запрос выполняется при итерации, не при объявлении.

csharp
// LINQ запросы к коллекциям
using System.Linq;

var users = new List<User>
{
    new User(1, "Alice", "alice@example.com"),
    new User(2, "Bob", "bob@test.com"),
    new User(3, "Charlie", "charlie@example.com"),
};

// Query syntax
var filteredUsers = from u in users
                     where u.Email.Contains("example")
                     orderby u.Name
                     select u;

// Method syntax с несколькими операциями
var result = users
    .Where(u => u.Email.Contains("example"))
    .OrderBy(u => u.Name)
    .Select(u => new { u.Name, u.Email })
    .ToList();

// GroupBy и агрегация
var emailsByDomain = users
    .GroupBy(u => u.Email.Split('@')[1])
    .Select(g => new { Domain = g.Key, Count = g.Count() });

// LINQ с async потоком (IAsyncEnumerable)
await foreach (var user in GetUsersAsync())
{
    Console.WriteLine(user.Name);
}

async IAsyncEnumerable<User> GetUsersAsync()
{
    yield return new User(1, "Alice", "alice@example.com");
    await Task.Delay(100);
    yield return new User(2, "Bob", "bob@test.com");
}

LINQ-запрос filteredUsers отфильтровывает пользователей по домену email и сортирует по имени. Method syntax .Where().OrderBy().Select() — цепочка методов, эквивалентная query syntax. GroupBy группирует по домену email. IAsyncEnumerable (C# 8) — асинхронная версия IEnumerable, полезная для потоковой загрузки данных в мобильном приложении.

Xamarin и .NET MAUI: архитектура

Xamarin (2011–2024) — первая платформа Microsoft для кроссплатформенной мобильной разработки на C#. Состоял из Xamarin.Android (Mono runtime поверх Linux ядра) и Xamarin.iOS (AOT-компиляция в ARM64 из-за запрета JIT на iOS). Xamarin.Forms — общий UI-слой с XAML-разметкой, транслирующий элементы в нативные (Android View / iOS UIView).

.NET MAUI (.NET Multi-platform App UI) — преемник Xamarin, выпущенный в 2022 году. Единый проект .csproj, одна XAML-разметка, одна точка входа. Поддерживает 5 платформ: iOS, Android, Windows (WinUI 3), macOS (Mac Catalyst), Tizen. .NET MAUI использует новую архитектуру Handler вместо Renderer: каждый элемент XAML маппится на нативный компонент через платформенный handler.

xml
<!-- MainPage.xaml — декларативный UI .NET MAUI -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainPage">

    <ScrollView>
        <VerticalStackLayout Padding="30" Spacing="25">
            <Label Text="Welcome to .NET MAUI!"
                   FontSize="32"
                   HorizontalOptions="Center"/>

            <Entry x:Name="NameEntry"
                   Placeholder="Enter your name"/>

            <Button Text="Submit"
                    Clicked="OnSubmitClicked"
                    BackgroundColor="#512BD4"
                    TextColor="White"
                    CornerRadius="8"/>

            <CollectionView x:Name="ItemsView"
                          SelectionMode="Single">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Grid Padding="10">
                            <Label Text="{Binding Name}"
                                   FontSize="18"/>
                        </Grid>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

XAML-разметка .NET MAUI описывает UI декларативно. ScrollView — прокрутка, VerticalStackLayout — вертикальное расположение. Label, Entry (ввод текста), Button — базовые элементы. CollectionView — виртуализированный список с DataTemplate для отображения элементов. Событие Clicked привязывается к методу OnSubmitClicked в code-behind MainPage.xaml.cs.

csharp
// MainPage.xaml.cs — code-behind с C# логикой
namespace MyApp;

public partial class MainPage : ContentPage
{
    private readonly List<User> _users = new();

    public MainPage()
    {
        InitializeComponent();
        LoadUsers();
    }

    private async void OnSubmitClicked(object? sender, EventArgs e)
    {
        var name = NameEntry.Text?.Trim();

        if (string.IsNullOrEmpty(name))
        {
            await DisplayAlert("Error", "Name is required", "OK");
            return;
        }

        _users.Add(new User(_users.Count + 1, name, $"{name}@example.com"));
        ItemsView.ItemsSource = null;
        ItemsView.ItemsSource = _users;
        NameEntry.Text = string.Empty;
    }

    private async void LoadUsers()
    {
        var apiService = new ApiService();
        var users = await apiService.GetUsersAsync();
        _users.AddRange(users);
        ItemsView.ItemsSource = _users;
    }
}

Code-behind MainPage наследует ContentPage. InitializeComponent() загружает XAML-разметку. NameEntry.Text?.Trim() — null-conditional оператор (?.) для безопасного доступа. DisplayAlert — нативный диалог. ItemsView.ItemsSource — Binding к коллекции. async/await для асинхронной загрузки. API MVVM (Model-View-ViewModel) рекомендуется для сложных проектов.

C# в мобильной разработке

C# мобильная разработка предлагает три подхода: .NET MAUI (кроссплатформенный UI), Xamarin (легаси) и Unity (игры). .NET MAUI — рекомендуемый путь для новых проектов. Приложение на C# компилируется в Intermediate Language (IL), который NativeAOT (.NET MAUI) или Mono (Xamarin) преобразуют в нативный ARM-код. iOS требует AOT-компиляции — JIT запрещён политиками Apple.

Доступ к нативным API

.NET MAUI предоставляет единые API для работы с платформенными возможностями через интерфейсы: IAccelerometer, IBarometer, IBattery, IConnectivity, IDeviceInfo, IFilePicker, IGeolocation, IMediaPicker, IPermissions, ISpeechRecognizer, IVibration. Для платформоспецифичного кода используется Conditional compilation (#if ANDROID, #if IOS) или partial class.

csharp
// Геолокация в .NET MAUI с DI
public class LocationService
{
    private readonly IGeolocation _geolocation;

    public LocationService(IGeolocation geolocation)
    {
        _geolocation = geolocation;
    }

    public async Task<Location?> GetCurrentLocation()
    {
        try
        {
            var permission = await CheckAndRequestPermission();
            if (permission != PermissionStatus.Granted)
                return null;

            var location = await _geolocation.GetLastKnownLocationAsync();

            if (location == null)
            {
                location = await _geolocation.GetLocationAsync(new GeolocationRequest
                {
                    DesiredAccuracy = GeolocationAccuracy.Medium,
                    Timeout = TimeSpan.FromSeconds(10)
                });
            }

            return location;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Location error: {ex.Message}");
            return null;
        }
    }

    private async Task<PermissionStatus> CheckAndRequestPermission()
    {
        var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();

        if (status != PermissionStatus.Granted)
        {
            status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
        }

        return status;
    }
}

Сервис LocationService использует DI (внедрение зависимости IGeolocation). CheckAndRequestPermission проверяет и запрашивает разрешение геолокации. GetLastKnownLocationAsync — быстрый (но не всегда точный) ответ, GetLocationAsync — запрос с параметрами точности и таймаута. null-проверки (location == null) с nullable reference types. try-catch обрабатывает исключения платформы.

Производительность C# на мобильных

C# на мобильных устройствах показывает производительность, сопоставимую с Java/Kotlin на Android и Swift на iOS. NativeAOT (.NET 8+) компилирует C# сразу в нативный код без IL-промежуточного этапа — это уменьшает время запуска на 50% и снижает потребление памяти. GC в .NET MAUI оптимизирован для мобильных платформ с короткими паузами (Workstation GC). Размер APK — ~20-30 МБ (с NativeAOT).

ПараметрXamarin.NET MAUI
АрхитектураXamarin.Android + Xamarin.iOSЕдиный проект .csproj
UI-рендерингRenderer (Xamarin.Forms)Handler (.NET MAUI)
КомпиляцияMono JIT (Android), AOT (iOS)NativeAOT (все платформы)
СтатусРежим поддержкиАктивная разработка
ПлатформыAndroid, iOS, WindowsAndroid, iOS, Windows, macOS, Tizen

Платформа .NET и CLR

Платформа .NET — экосистема для выполнения managed-кода, включающая CLR (Common Language Runtime), BCL (Base Class Library), ASP.NET Core для серверной разработки и .NET MAUI для мобильных приложений. .NET 8+ — единая платформа для всех типов приложений: мобильные, десктопные, веб, облачные, IoT, Игры (Unity).

CLR — виртуальная машина, выполняющая CIL (Common Intermediate Language) код. C#, VB.NET, F# компилируются в CIL. JIT-компилятор CLR преобразует CIL в машинный код при первом вызове метода. NativeAOT (предварительная компиляция) компилирует CIL в нативный код на этапе сборки — идеально для мобильных платформ, где JIT может быть ограничен (iOS).

Сборщик мусора GC .NET — generational (поколения 0, 1, 2), автоматически освобождает неиспользуемые объекты. Для мобильных приложений рекомендуется Workstation GC с минимальными паузами. GC происходит в отдельном потоке, не блокируя UI-поток. Background GC — фоновый сборщик, минимизирующий паузы для интерактивных приложений.

Инструменты C# разработчика

Инструменты C# разработчика включают Visual Studio, .NET SDK, dotnet CLI, NuGet, JetBrains Rider. Visual Studio 2022 — основная IDE с дизайнером XAML, отладчиком managed и нативного кода, профилировщиком CPU/памяти. .NET SDK включает компилятор csc, dotnet CLI (dotnet new, dotnet build, dotnet publish, dotnet test).

NuGet — менеджер пакетов .NET, аналогичный npm для JS. 300 000+ пакетов, включая CommunityToolkit.Maui (UI-компоненты), SQLite-net (БД), Firebase Cloud Messaging, ZXing.Net.Maui (QR-коды). .NET MAUI Community Toolkit — набор поведений, конвертеров, анимаций для ускорения разработки. RestSharp и Refit — HTTP-клиенты. Prism и MVVM Community Toolkit — архитектурные фреймворки.

xml
<!-- .csproj — конфигурация .NET MAUI проекта -->
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <UseMaui>true</UseMaui>
    <ApplicationTitle>MyMAUIApp</ApplicationTitle>
    <ApplicationId>com.example.mymauiapp</ApplicationId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="CommunityToolkit.Maui" Version="9.0.0" />
    <PackageReference Include="sqlite-net-pcl" Version="1.9.172" />
    <PackageReference Include="Refit" Version="7.0.0" />
  </ItemGroup>

</Project>

Файл .csproj — конфигурация .NET MAUI проекта. TargetFrameworks перечисляет целевые платформы. UseMaui включает MAUI SDK. PackageReference — зависимости из NuGet. CommunityToolkit.Maui — UI-компоненты (тосты, снэкбары, Popup). sqlite-net-pcl — локальная БД. Refit — типизированный HTTP-клиент на основе интерфейсов. dotnet build/publish собирает приложение для всех платформ.

Часто задаваемые вопросы

Что такое C#?

C# — объектно-ориентированный язык программирования от Microsoft (2000), работающий на платформе .NET (CLR). Используется для мобильной разработки через Xamarin и .NET MAUI. Сочетает строгую статическую типизацию, автоматическое управление памятью (GC), LINQ, async/await и дженерики. Занимает 4-е место в индексе TIOBE (2026). Разработан Андерсом Хейлсбергом.

Чем Xamarin отличается от .NET MAUI?

Xamarin — предшественник (2011-2024), разделял проекты на Xamarin.Android и Xamarin.iOS. .NET MAUI (2022+) — единый проект .csproj с общей XAML-разметкой, архитектурой Handler вместо Renderer и поддержкой 5 платформ (iOS, Android, Windows, macOS, Tizen). Xamarin перешёл в режим поддержки, новые проекты создаются на .NET MAUI. NativeAOT доступен только в .NET MAUI.

Как C# работает на мобильных платформах?

C# компилируется в CIL (Common Intermediate Language), который NativeAOT (.NET MAUI) или Mono (Xamarin) преобразуют в нативный ARM-код. Android использует Mono runtime (Xamarin) или NativeAOT (.NET MAUI) для выполнения IL. iOS требует AOT-компиляции — JIT запрещён Apple. .NET MAUI предоставляет единые API для камеры, GPS, сенсоров с платформенной реализацией через интерфейсы.

Какие типы данных поддерживает C#?

C# делит типы на value types (int, double, bool, char, struct, enum — стек) и reference types (string, class, interface, array, delegate, record — куча). Nullable-типы (int?) разрешают null для value types. record (C# 9) — иммутабельный reference type с value-based равенством. record struct (C# 10) — value-версия. dynamic — динамическая типизация. var — вывод типа компилятором.

Какие инструменты используются для C# мобильной разработки?

Visual Studio 2022 (Windows) и Visual Studio for Mac — основные IDE с дизайнером XAML, отладчиком и профилировщиком. .NET SDK — компилятор csc, dotnet CLI, MSBuild. NuGet — менеджер пакетов (300 000+). CommunityToolkit.Maui — UI-компоненты. JetBrains Rider — альтернативная IDE. Для тестирования: xUnit, NUnit, Moq. Для CI/CD: Azure DevOps, GitHub Actions.

Итоги

  • C# — объектно-ориентированный язык Microsoft для .NET-платформы с GC, LINQ и строгой типизацией
  • .NET MAUI — преемник Xamarin с единым проектом, Handler-архитектурой и 5 платформами
  • XAML — декларативная разметка UI, общая для всех платформ с code-behind на C#
  • LINQ — встроенный язык запросов для коллекций, БД и XML с lazy evaluation
  • NativeAOT — предварительная компиляция в нативный код, уменьшающая время запуска на 50%
  • NuGet — менеджер пакетов с 300 000+ библиотек для .NET MAUI и Xamarin
  • Visual Studio и dotnet CLI — основные инструменты для сборки, тестирования и публикации

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также