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# — повністю керована мова: пам'ять управляється збирачем сміття (GC), межі масивів перевіряються, неініціалізовані змінні заборонені. Це робить C# безпечнішим за C++ при порівнянній продуктивності через AOT-компіляцію.
C# 1.0 (2000) — базова ООП-мова. C# 3.0 (2007) — LINQ, лямбда-вирази, методи розширення. C# 6.0 (2015) — інтерполяція рядків, null-conditional оператор. C# 8.0 (2019) — nullable reference types (нульова безпека), асинхронні потоки, методи інтерфейсу за замовчуванням. C# 10 (2021) — global usings, простори імен у межах файлу, record struct. C# 12 (2023) — primary constructors, вирази колекцій, перехоплювачі. Кожна версія приносить покращення, актуальні для мобільної розробки.
| Версія C# | Рік | Ключова фіча | Значення для мобільної розробки |
|---|---|---|---|
| 3.0 | 2007 | LINQ, лямбди | Спрощена робота з колекціями та БД |
| 6.0 | 2015 | ?. (null-conditional), інтерполяція рядків | Безпечний доступ до властивостей, читабельні рядки |
| 8.0 | 2019 | Nullable reference types, асинхронні потоки | Null safety, асинхронні потоки даних |
| 10 | 2021 | Record struct, global usings | Value-типи, скорочення шаблонного коду |
| 12 | 2023 | Primary constructors, вирази колекцій | Лаконічний запис класів та колекцій |
Синтаксис C# — C-подібний, строго типізований. Все є об'єктом, включаючи примітиви (int, double, bool — це структури, що успадковують ValueType). C# ділить типи на типи значень (int, double, bool, struct, enum — зберігаються на стеку) та типи посилань (string, class, interface, delegate, array, record — зберігаються в купі). Nullable-типи (int?) дозволяють null для типів значень.
C# підтримує класи (class), структури (struct), записи (record), інтерфейси (interface), переліки (enum) та делегати (delegate). record — імутабельний тип посилання з 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)). Ліниве завантаження (відкладене виконання): запит виконується при ітерації, а не при оголошенні.
// 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 з асинхронним потоком (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 для асинхронного завантаження. Патерн 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. Для платформенно-специфічного коду використовується умовна компіляція (#if ANDROID, #if IOS) або частковий клас.
// Геолокація в .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($"Помилка розташування: {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 — екосистема для виконання керованого коду, що включає 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 — поколіннєвий (покоління 0, 1, 2), автоматично звільняє невикористовувані об'єкти. Для мобільних застосунків рекомендується Workstation GC з мінімальними паузами. GC відбувається в окремому потоці, не блокуючи UI-потік. Background GC — фоновий збирач, що мінімізує паузи для інтерактивних застосунків.
Інструменти C# розробника включають Visual Studio, .NET SDK, dotnet CLI, NuGet, JetBrains Rider. Visual Studio 2022 — основна IDE з дизайнером XAML, відладчиком керованого та нативного коду, профілювальником 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# ділить типи на типи значень (int, double, bool, char, struct, enum — стек) та типи посилань (string, class, interface, array, delegate, record — купа). Nullable-типи (int?) дозволяють null для типів значень. record (C# 9) — імутабельний тип посилання з 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.