C#: các khái niệm chính của ngôn ngữ, phát triển .NET MAUI và Xamarin

Tác giả: IT Sectr Đã đăng: 2026-02-10 Thời gian đọc: 12 phút

C# là ngôn ngữ lập trình hướng đối tượng hiện đại của Microsoft, đóng vai trò nền tảng cho Xamarin và .NET MAUI trong phát triển di động. Nhờ hệ sinh thái .NET thống nhất, các nhà phát triển có thể tạo ứng dụng di động cho iOS và Android bằng mã C# và XAML dùng chung. Theo chỉ số TIOBE (2026), C# đứng thứ 4 về mức độ phổ biến trong tất cả các ngôn ngữ lập trình. Tìm hiểu thêm trong tài liệu Microsoft C#.

Những điểm chính

  • C# — ngôn ngữ hướng đối tượng của Microsoft cho nền tảng .NET
  • .NET MAUI — sự kế thừa của Xamarin, dự án duy nhất cho iOS, Android, Windows, macOS
  • XAML — đánh dấu UI khai báo, dùng chung cho tất cả nền tảng .NET
  • CLR — Common Language Runtime với biên dịch JIT/AOT và dọn rác
  • LINQ — Language Integrated Query để làm việc với bộ sưu tập và cơ sở dữ liệu

C# là gì?

C# (phát âm là "si sharp") là ngôn ngữ lập trình hướng đối tượng với hệ thống kiểu an toàn, được Microsoft phát triển vào năm 2000 dưới sự dẫn dắt của Anders Hejlsberg. Tên gọi được lấy cảm hứng từ ký hiệu âm nhạc (sharp — tăng cao độ). C# chạy trên nền tảng .NET, bao gồm Common Language Runtime (CLR) và thư viện lớp phong phú (BCL — Base Class Library).

Trong phát triển di động, C# được sử dụng qua hai công nghệ: Xamarin (2011–2024) và người kế nhiệm .NET MAUI (2022+). Xamarin cho phép tạo ứng dụng Android và iOS gốc với mã C# dùng chung, tách biệt các dự án nền tảng cụ thể. .NET MAUI kết hợp tất cả nền tảng vào một dự án duy nhất với đánh dấu XAML dùng chung và truy cập API gốc qua giao diện nền tảng.

Đặc điểm chính của C# là kiểu tĩnh nghiêm ngặt với khả năng phân phối động qua dynamic, từ khóa var (suy luận kiểu) và hệ thống generics mạnh mẽ. C# là ngôn ngữ được quản lý hoàn toàn: bộ nhớ được quản lý bởi bộ dọn rác (GC), ranh giới mảng được kiểm tra, biến chưa khởi tạo bị cấm. Điều này làm cho C# an toàn hơn C++ với hiệu suất tương đương nhờ biên dịch AOT.

Các phiên bản C# và sự phát triển

C# 1.0 (2000) — ngôn ngữ OOP cơ bản. C# 3.0 (2007) — LINQ, biểu thức lambda, phương thức mở rộng. C# 6.0 (2015) — nội suy chuỗi, toán tử null-conditional. C# 8.0 (2019) — kiểu tham chiếu nullable (bật an toàn null), luồng bất đồng bộ, phương thức giao diện mặc định. C# 10 (2021) — global usings, không gian tên theo tệp, record struct. C# 12 (2023) — hàm tạo chính, biểu thức bộ sưu tập, bộ chặn. Mỗi phiên bản mang đến cải tiến liên quan đến phát triển di động.

Phiên bản C#NămTính năng chínhÝ nghĩa cho phát triển di động
3.02007LINQ, lambdaLàm việc đơn giản hóa với bộ sưu tập và cơ sở dữ liệu
6.02015?. (null-conditional), nội suy chuỗiTruy cập thuộc tính an toàn, chuỗi dễ đọc
8.02019Kiểu tham chiếu nullable, luồng bất đồng bộAn toàn null, luồng dữ liệu bất đồng bộ
102021Record struct, global usingsKiểu giá trị, giảm mã mẫu
122023Hàm tạo chính, biểu thức bộ sưu tậpKý pháp lớp và bộ sưu tập ngắn gọn

Cú pháp C#: kiểu dữ liệu, lớp và LINQ

Cú pháp C# giống C, được kiểu hóa nghiêm ngặt. Mọi thứ đều là đối tượng, bao gồm cả kiểu nguyên thủy (int, double, bool — là cấu trúc kế thừa ValueType). C# chia kiểu thành kiểu giá trị (int, double, bool, struct, enum — lưu trên ngăn xếp) và kiểu tham chiếu (string, class, interface, delegate, array, record — lưu trên đống). Kiểu nullable (int?) cho phép null cho kiểu giá trị.

Kiểu dữ liệu và lớp

C# hỗ trợ lớp (class), cấu trúc (struct), bản ghi (record), giao diện (interface), liệt kê (enum) và ủy quyền (delegate). record là kiểu tham chiếu bất biến với tính bằng nhau dựa trên giá trị (hai bản ghi bằng nhau nếu tất cả trường của chúng bằng nhau). record struct là phiên bản giá trị của record, được giới thiệu trong C# 10. Hàm tạo chính (C# 12) kết hợp khai báo và khởi tạo trong một dòng.

csharp
// Kiểu và lớp cơ bản trong C#
using System;
using System.Collections.Generic;

// Bản ghi với hàm tạo chính (C# 12)
public record User(int Id, string Name, string Email);

// Lớp với thuộc tính nullable
public class AppConfig
{
    public string AppName { get; init; }
    public string? ApiUrl { get; set; } // nullable reference type
    public int Version { get; init; }

    // Phương thức với thân biểu thức
    public string GetDisplayName() => $"{AppName} v{Version}";
}

// Phương thức mở rộng
public static class StringExtensions
{
    public static bool IsValidEmail(this string email) =>
        email.Contains("@") && email.Contains(".");
}

// Sử dụng
var user = new User(1, "Alice", "alice@example.com");
bool validEmail = user.Email.IsValidEmail();

Bản ghi User với hàm tạo chính tự động tạo equals, hashCode, ToString, Deconstruct và sao chép with. Trình thiết lập init-only (AppName) cho phép đặt giá trị chỉ trong bộ khởi tạo. Thân biểu thức (=>) là ký pháp ngắn gọn cho phương thức đơn giản. Phương thức mở rộng IsValidEmail thêm phương thức vào string mà không cần kế thừa.

LINQ — Language Integrated Query

LINQ là ngôn ngữ truy vấn tích hợp cho bộ sưu tập, cơ sở dữ liệu, XML. LINQ to Objects — truy vấn đến bộ sưu tập IEnumerable. LINQ to SQL — đến cơ sở dữ liệu. LINQ to XML — đến XML. Cú pháp có thể là truy vấn (from u in users where u.Age > 18 select u) và phương thức (users.Where(u => u.Age > 18).Select(u => u)). Tải trễ (thực thi trì hoãn): truy vấn thực thi khi lặp, không phải khi khai báo.

csharp
// Truy vấn LINQ đến bộ sưu tập
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"),
};

// Cú pháp truy vấn
var filteredUsers = from u in users
                     where u.Email.Contains("example")
                     orderby u.Name
                     select u;

// Cú pháp phương thức với nhiều thao tác
var result = users
    .Where(u => u.Email.Contains("example"))
    .OrderBy(u => u.Name)
    .Select(u => new { u.Name, u.Email })
    .ToList();

// GroupBy và tổng hợp
var emailsByDomain = users
    .GroupBy(u => u.Email.Split('@')[1])
    .Select(g => new { Domain = g.Key, Count = g.Count() });

// LINQ với luồng bất đồng bộ (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");
}

Truy vấn LINQ filteredUsers lọc người dùng theo tên miền email và sắp xếp theo tên. Cú pháp phương thức .Where().OrderBy().Select() là chuỗi phương thức tương đương với cú pháp truy vấn. GroupBy nhóm theo tên miền email. IAsyncEnumerable (C# 8) là phiên bản bất đồng bộ của IEnumerable, hữu ích cho tải dữ liệu luồng trong ứng dụng di động.

Xamarin và .NET MAUI: kiến trúc

Xamarin (2011–2024) là nền tảng đầu tiên của Microsoft cho phát triển di động đa nền tảng bằng C#. Nó bao gồm Xamarin.Android (Mono runtime trên nhân Linux) và Xamarin.iOS (biên dịch AOT sang ARM64 do lệnh cấm JIT trên iOS). Xamarin.Forms là lớp UI dùng chung với đánh dấu XAML, dịch các phần tử sang gốc (Android View / iOS UIView).

.NET MAUI (.NET Multi-platform App UI) là người kế nhiệm Xamarin, phát hành năm 2022. Một dự án .csproj duy nhất, một đánh dấu XAML, một điểm vào. Hỗ trợ 5 nền tảng: iOS, Android, Windows (WinUI 3), macOS (Mac Catalyst), Tizen. .NET MAUI sử dụng kiến trúc Handler mới thay vì Renderer: mỗi phần tử XAML ánh xạ tới thành phần gốc qua trình xử lý nền tảng.

xml
<!-- MainPage.xaml — UI khai báo .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>

Đánh dấu XAML của .NET MAUI mô tả UI một cách khai báo. ScrollView — cuộn, VerticalStackLayout — sắp xếp dọc. Label, Entry (nhập văn bản), Button — phần tử cơ bản. CollectionView — danh sách ảo hóa với DataTemplate để hiển thị mục. Sự kiện Clicked được gắn với phương thức OnSubmitClicked trong code-behind MainPage.xaml.cs.

csharp
// MainPage.xaml.cs — code-behind với logic 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 kế thừa ContentPage. InitializeComponent() tải đánh dấu XAML. NameEntry.Text?.Trim() — toán tử null-conditional (?.) để truy cập an toàn. DisplayAlert — hộp thoại gốc. ItemsView.ItemsSource — Ràng buộc tới bộ sưu tập. async/await cho tải bất đồng bộ. Mẫu MVVM (Model-View-ViewModel) được khuyến nghị cho các dự án phức tạp.

C# trong phát triển di động

Phát triển di động với C# cung cấp ba cách tiếp cận: .NET MAUI (UI đa nền tảng), Xamarin (kế thừa) và Unity (trò chơi). .NET MAUI là lộ trình khuyến nghị cho các dự án mới. Ứng dụng C# được biên dịch thành Intermediate Language (IL), mà NativeAOT (.NET MAUI) hoặc Mono (Xamarin) chuyển đổi thành mã ARM gốc. iOS yêu cầu biên dịch AOT — JIT bị cấm bởi chính sách của Apple.

Truy cập API gốc

.NET MAUI cung cấp API thống nhất để làm việc với khả năng nền tảng qua giao diện: IAccelerometer, IBarometer, IBattery, IConnectivity, IDeviceInfo, IFilePicker, IGeolocation, IMediaPicker, IPermissions, ISpeechRecognizer, IVibration. Đối với mã dành riêng cho nền tảng, sử dụng biên dịch có điều kiện (#if ANDROID, #if IOS) hoặc lớp một phần.

csharp
// Định vị địa lý trong .NET MAUI với 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($"Lỗi vị trí: {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;
    }
}

Dịch vụ LocationService sử dụng DI (tiêm phụ thuộc IGeolocation). CheckAndRequestPermission kiểm tra và yêu cầu quyền định vị địa lý. GetLastKnownLocationAsync — phản hồi nhanh (không phải lúc nào cũng chính xác), GetLocationAsync — yêu cầu với tham số độ chính xác và thời gian chờ. Kiểm tra null (location == null) với kiểu tham chiếu nullable. try-catch xử lý ngoại lệ nền tảng.

Hiệu suất của C# trên di động

C# trên thiết bị di động thể hiện hiệu suất tương đương Java/Kotlin trên Android và Swift trên iOS. NativeAOT (.NET 8+) biên dịch C# trực tiếp thành mã gốc mà không qua giai đoạn IL trung gian — điều này giảm thời gian khởi động 50% và giảm tiêu thụ bộ nhớ. GC trong .NET MAUI được tối ưu hóa cho nền tảng di động với thời gian tạm dừng ngắn (Workstation GC). Kích thước APK khoảng 20-30 MB (với NativeAOT).

Tham sốXamarin.NET MAUI
Kiến trúcXamarin.Android + Xamarin.iOSDự án .csproj duy nhất
Kết xuất UIRenderer (Xamarin.Forms)Handler (.NET MAUI)
Biên dịchMono JIT (Android), AOT (iOS)NativeAOT (tất cả nền tảng)
Trạng tháiChế độ bảo trìPhát triển tích cực
Nền tảngAndroid, iOS, WindowsAndroid, iOS, Windows, macOS, Tizen

Nền tảng .NET và CLR

Nền tảng .NET là hệ sinh thái để thực thi mã được quản lý, bao gồm CLR (Common Language Runtime), BCL (Base Class Library), ASP.NET Core cho phát triển máy chủ và .NET MAUI cho ứng dụng di động. .NET 8+ là nền tảng thống nhất cho tất cả loại ứng dụng: di động, máy tính, web, đám mây, IoT, trò chơi (Unity).

CLR là máy ảo thực thi mã CIL (Common Intermediate Language). C#, VB.NET, F# được biên dịch thành CIL. Trình biên dịch JIT của CLR chuyển đổi CIL thành mã máy tại lần gọi phương thức đầu tiên. NativeAOT (biên dịch trước) biên dịch CIL thành mã gốc tại thời điểm xây dựng — lý tưởng cho nền tảng di động nơi JIT có thể bị hạn chế (iOS).

Bộ dọn rác GC của .NET là thế hệ (thế hệ 0, 1, 2), tự động giải phóng đối tượng không sử dụng. Cho ứng dụng di động, Workstation GC với thời gian tạm dừng tối thiểu được khuyến nghị. GC chạy trong luồng riêng, không chặn luồng UI. Background GC là bộ thu gom nền giảm thiểu thời gian tạm dừng cho ứng dụng tương tác.

Công cụ phát triển C#

Công cụ phát triển C# bao gồm Visual Studio, .NET SDK, dotnet CLI, NuGet, JetBrains Rider. Visual Studio 2022 là IDE chính với trình thiết kế XAML, trình gỡ lỗi mã được quản lý và gốc, trình phân tích CPU/bộ nhớ. .NET SDK bao gồm trình biên dịch csc, dotnet CLI (dotnet new, dotnet build, dotnet publish, dotnet test).

NuGet là trình quản lý gói .NET, tương tự npm cho JS. Hơn 300.000 gói, bao gồm CommunityToolkit.Maui (thành phần UI), SQLite-net (cơ sở dữ liệu), Firebase Cloud Messaging, ZXing.Net.Maui (mã QR). .NET MAUI Community Toolkit là bộ hành vi, bộ chuyển đổi, hoạt ảnh để tăng tốc phát triển. RestSharp và Refit — ứng dụng khách HTTP. Prism và MVVM Community Toolkit — khung kiến trúc.

xml
<!-- .csproj — cấu hình dự án .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>

Tệp .csproj là cấu hình dự án .NET MAUI. TargetFrameworks liệt kê các nền tảng mục tiêu. UseMaui bật SDK MAUI. PackageReference chỉ định phụ thuộc từ NuGet. CommunityToolkit.Maui cung cấp thành phần UI (toast, snackbar, Popup). sqlite-net-pcl là cơ sở dữ liệu cục bộ. Refit là ứng dụng khách HTTP có kiểu dựa trên giao diện. dotnet build/publish xây dựng ứng dụng cho tất cả nền tảng.

Câu hỏi thường gặp

C# là gì?

C# là ngôn ngữ lập trình hướng đối tượng của Microsoft (2000), chạy trên nền tảng .NET (CLR). Được sử dụng cho phát triển di động qua Xamarin và .NET MAUI. Kết hợp kiểu tĩnh nghiêm ngặt, quản lý bộ nhớ tự động (GC), LINQ, async/await và generics. Đứng thứ 4 trong chỉ số TIOBE (2026). Được phát triển bởi Anders Hejlsberg.

Xamarin khác .NET MAUI như thế nào?

Xamarin là tiền nhiệm (2011-2024), chia dự án thành Xamarin.Android và Xamarin.iOS. .NET MAUI (2022+) là dự án .csproj duy nhất với đánh dấu XAML dùng chung, kiến trúc Handler thay vì Renderer và hỗ trợ 5 nền tảng (iOS, Android, Windows, macOS, Tizen). Xamarin đã chuyển sang chế độ bảo trì, các dự án mới được tạo trên .NET MAUI. NativeAOT chỉ khả dụng trong .NET MAUI.

C# hoạt động như thế nào trên nền tảng di động?

C# biên dịch thành CIL (Common Intermediate Language), mà NativeAOT (.NET MAUI) hoặc Mono (Xamarin) chuyển đổi thành mã ARM gốc. Android sử dụng Mono runtime (Xamarin) hoặc NativeAOT (.NET MAUI) để thực thi IL. iOS yêu cầu biên dịch AOT — JIT bị cấm bởi Apple. .NET MAUI cung cấp API thống nhất cho camera, GPS, cảm biến với triển khai nền tảng qua giao diện.

C# hỗ trợ những kiểu dữ liệu nào?

C# chia kiểu thành kiểu giá trị (int, double, bool, char, struct, enum — ngăn xếp) và kiểu tham chiếu (string, class, interface, array, delegate, record — đống). Kiểu nullable (int?) cho phép null cho kiểu giá trị. record (C# 9) là kiểu tham chiếu bất biến với tính bằng nhau dựa trên giá trị. record struct (C# 10) là phiên bản giá trị. dynamic — kiểu động. var — suy luận kiểu của trình biên dịch.

Những công cụ nào được sử dụng cho phát triển di động với C#?

Visual Studio 2022 (Windows) và Visual Studio for Mac là các IDE chính với trình thiết kế XAML, trình gỡ lỗi và trình phân tích. .NET SDK — trình biên dịch csc, dotnet CLI, MSBuild. NuGet — trình quản lý gói (hơn 300.000). CommunityToolkit.Maui — thành phần UI. JetBrains Rider — IDE thay thế. Kiểm thử: xUnit, NUnit, Moq. CI/CD: Azure DevOps, GitHub Actions.

Tổng kết

  • C# — ngôn ngữ hướng đối tượng của Microsoft cho nền tảng .NET với GC, LINQ và kiểu nghiêm ngặt
  • .NET MAUI — sự kế thừa của Xamarin với dự án duy nhất, kiến trúc Handler và 5 nền tảng
  • XAML — đánh dấu UI khai báo dùng chung trên tất cả nền tảng với code-behind C#
  • LINQ — ngôn ngữ truy vấn tích hợp cho bộ sưu tập, cơ sở dữ liệu và XML với đánh giá trễ
  • NativeAOT — biên dịch trước thành mã gốc, giảm thời gian khởi động 50%
  • NuGet — trình quản lý gói với hơn 300.000 thư viện cho .NET MAUI và Xamarin
  • Visual Studio và dotnet CLI — công cụ chính để xây dựng, kiểm thử và xuất bản

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm