C# — современный объектно-ориентированный язык программирования от Microsoft, являющийся основой для платформ Xamarin и .NET MAUI в мобильной разработке. Благодаря единой экосистеме .NET разработчики могут создавать мобильные приложения для iOS и Android, используя общий код на C# и XAML. По данным индекса TIOBE (2026), C# занимает 4-е место по популярности среди всех языков программирования. Подробнее — в документации Microsoft 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# 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.0 | 2007 | LINQ, лямбды | Упрощённая работа с коллекциями и БД |
| 6.0 | 2015 | ?. (null-conditional), string interpolation | Безопасный доступ к свойствам, читаемые строки |
| 8.0 | 2019 | Nullable reference types, async streams | Null safety, асинхронные потоки данных |
| 10 | 2021 | Record struct, global usings | Value-типы, сокращение boilerplate |
| 12 | 2023 | Primary constructors, collection expressions | Лаконичная запись классов и коллекций |
Синтаксис 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) объединяют объявление и инициализацию в одну строку.
// Базовые типы и классы 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 — встроенный язык запросов к коллекциям, базам данных, 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): запрос выполняется при итерации, не при объявлении.
// 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 (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.
<!-- 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.
// 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# мобильная разработка предлагает три подхода: .NET MAUI (кроссплатформенный UI), Xamarin (легаси) и Unity (игры). .NET MAUI — рекомендуемый путь для новых проектов. Приложение на C# компилируется в Intermediate Language (IL), который NativeAOT (.NET MAUI) или Mono (Xamarin) преобразуют в нативный ARM-код. iOS требует AOT-компиляции — JIT запрещён политиками Apple.
.NET MAUI предоставляет единые API для работы с платформенными возможностями через интерфейсы: IAccelerometer, IBarometer, IBattery, IConnectivity, IDeviceInfo, IFilePicker, IGeolocation, IMediaPicker, IPermissions, ISpeechRecognizer, IVibration. Для платформоспецифичного кода используется Conditional compilation (#if ANDROID, #if IOS) или partial class.
// Геолокация в .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# на мобильных устройствах показывает производительность, сопоставимую с 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, Windows | Android, iOS, Windows, macOS, Tizen |
Платформа .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# разработчика включают 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 — архитектурные фреймворки.
<!-- .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# — объектно-ориентированный язык программирования от Microsoft (2000), работающий на платформе .NET (CLR). Используется для мобильной разработки через Xamarin и .NET MAUI. Сочетает строгую статическую типизацию, автоматическое управление памятью (GC), LINQ, async/await и дженерики. Занимает 4-е место в индексе TIOBE (2026). Разработан Андерсом Хейлсбергом.
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# компилируется в 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# делит типы на 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 — вывод типа компилятором.
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.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также