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) — основни OOP језик. C# 3.0 (2007) — LINQ, ламбда изрази, extension methods. C# 6.0 (2015) — string interpolation, null-conditional оператор. C# 8.0 (2019) — nullable reference types (укључивање null безбедности), 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 безбедност, асинхрони токови података |
| 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 са једнакошћу заснованом на вредности (два 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();Запис 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 филтрира кориснике по имејл домену и сортира по имену. Method syntax .Where().OrderBy().Select() — ланац метода, еквивалент query syntax-у. GroupBy групише по имејл домену. 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) или 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($"Грешка локације: {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 MB (са 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# дели типове на 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 са једнакошћу заснованом на вредности. 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође