C#:语言关键概念、.NET MAUI 和 Xamarin 开发

作者: IT Sectr 发布日期: 2026-02-10 阅读时间: 12 分钟

C#——微软推出的一种现代面向对象编程语言,是移动开发中 Xamarin 和 .NET MAUI 平台的基础。得益于统一的 .NET 生态系统,开发者可以使用 C# 和 XAML 的共享代码创建适用于 iOS 和 Android 的移动应用程序。根据 TIOBE 指数(2026),C# 在所有编程语言中受欢迎程度排名第 4。更多信息请参阅微软 C# 文档

要点

  • C#——微软面向 .NET 平台的面向对象语言
  • .NET MAUI——Xamarin 的继任者,面向 iOS、Android、Windows、macOS 的单一项目
  • XAML——声明式 UI 标记,所有 .NET 平台通用
  • CLR——具有 JIT/AOT 编译和垃圾回收的 Common Language Runtime
  • LINQ——用于处理集合和数据库的 Language Integrated Query

什么是 C#?

C#(读作「C Sharp」)——一种具有安全类型系统的面向对象编程语言,由微软于 2000 年在 Anders Hejlsberg 的领导下开发。其名称灵感来源于音乐符号(升号——音高升高)。C# 运行在 .NET 平台上,该平台包括 Common Language Runtime (CLR) 和庞大的基类库 (BCL)。

在移动开发中,C# 通过两种技术使用:Xamarin(2011–2024)及其继任者 .NET MAUI(2022+)。Xamarin 允许使用共享的 C# 代码创建原生 Android 和 iOS 应用程序,但需要分离平台项目。.NET MAUI 将所有平台整合到一个项目中,使用通用的 XAML 标记并通过平台接口访问原生 API。

C# 的关键特性——严格的静态类型,可通过 dynamic 进行动态调度,var 关键字(类型推断)和强大的泛型系统。C# 是一种完全托管的语言:内存由垃圾回收器 (GC) 管理,数组边界受到检查,未初始化的变量被禁止。这使得 C# 通过 AOT 编译在性能可比的情况下比 C++ 更安全。

C# 版本和演进

C# 1.0(2000)——基础 OOP 语言。C# 3.0(2007)——LINQ、Lambda 表达式、扩展方法。C# 6.0(2015)——字符串插值、null 条件运算符。C# 8.0(2019)——可为空引用类型(启用 null 安全性)、异步流、默认接口方法。C# 10(2021)——全局 using、文件作用域命名空间、记录结构。C# 12(2023)——主构造函数、集合表达式、拦截器。每个版本都带来与移动开发相关的改进。

C# 版本年份关键特性对移动开发的意义
3.02007LINQ、Lambda简化集合和数据库操作
6.02015?.(null 条件)、字符串插值安全访问属性、可读字符串
8.02019可为空引用类型、异步流Null 安全性、异步数据流
102021记录结构、全局 using值类型、减少模板代码
122023主构造函数、集合表达式类和集合的简洁写法

C# 语法:类型、类和 LINQ

C# 语法——类似 C,严格类型化。一切都是对象,包括基本类型(int、double、bool——这些是继承 ValueType 的结构)。C# 将类型分为值类型(int、double、bool、struct、enum——存储在栈上)和引用类型(string、class、interface、delegate、array、record——存储在堆上)。可为空类型(int?)允许值类型为 null。

数据类型和类

C# 支持类(class)、结构(struct)、记录(record)、接口(interface)、枚举(enum)和委托(delegate)。record——一种不可变的引用类型,具有基于值的相等性(如果两个 record 的所有字段都相等,则它们相等)。record struct——record 的值类型版本,在 C# 10 中引入。主构造函数(C# 12)将声明和初始化合并到一行中。

csharp
// C# 基本类型和类
using System;
using System.Collections.Generic;

// 带有主构造函数的 Record (C# 12)
public record User(int Id, string Name, string Email);

// 具有可为空属性的类
public class AppConfig
{
    public string AppName { get; init; }
    public string? ApiUrl { get; set; } // 可为空引用类型
    public int Version { get; init; }

    // 带有表达式主体 (expression body) 的方法
    public string GetDisplayName() => $"{AppName} v{Version}";
}

// 扩展方法
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 记录会自动生成 equals、hashCode、ToString、Deconstruct 和 with-复制。仅初始化 setter(AppName)允许仅在初始化器中设置值。Expression body(=>)——简单方法的简洁写法。扩展方法 IsValidEmail 无需继承即可向 string 添加方法。

LINQ——Language Integrated Query

LINQ——用于集合、数据库、XML 的内置查询语言。LINQ to Objects——对 IEnumerable 集合的查询。LINQ to SQL——对数据库的查询。LINQ to XML——对 XML 的查询。语法可以是查询(from u in users where u.Age > 18 select u)和方法(users.Where(u => u.Age > 18).Select(u => u))。延迟执行:查询在迭代时执行,而非声明时。

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"),
};

// 查询语法
var filteredUsers = from u in users
                     where u.Email.Contains("example")
                     orderby u.Name
                     select u;

// 带有多个操作的方法语法
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");
}

filteredUsers LINQ 查询根据电子邮件域过滤用户并按名称排序。方法语法 .Where().OrderBy().Select()——方法链,等同于查询语法。GroupBy 按电子邮件域分组。IAsyncEnumerable(C# 8)——IEnumerable 的异步版本,适用于移动应用程序中的数据流加载。

Xamarin 和 .NET MAUI:架构

Xamarin(2011–2024)——微软第一个用于在 C# 中进行跨平台移动开发的平台。由 Xamarin.Android(基于 Linux 内核的 Mono 运行时)和 Xamarin.iOS(由于 iOS 禁止 JIT 而进行 AOT 编译到 ARM64)组成。Xamarin.Forms——具有 XAML 标记的通用 UI 层,将元素转换为原生元素(Android View / iOS UIView)。

.NET MAUI(.NET 多平台应用 UI)——Xamarin 的继任者,于 2022 年发布。单一 .csproj 项目,一种 XAML 标记,一个入口点。支持 5 个平台:iOS、Android、Windows (WinUI 3)、macOS (Mac Catalyst)、Tizen。.NET MAUI 使用新的 Handler 架构替代 Renderer:每个 XAML 元素通过平台 handler 映射到原生组件。

xml
<!-- MainPage.xaml — .NET MAUI 声明式 UI -->
<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>

.NET MAUI 的 XAML 标记以声明方式描述 UI。ScrollView——滚动,VerticalStackLayout——垂直布局。Label、Entry(文本输入)、Button——基本元素。CollectionView——带有 DataTemplate 的虚拟化列表,用于显示元素。Clicked 事件绑定到 MainPage.xaml.cs 代码后置中的 OnSubmitClicked 方法。

csharp
// MainPage.xaml.cs — 带有 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;
    }
}

MainPage 的代码后置继承 ContentPage。InitializeComponent() 加载 XAML 标记。NameEntry.Text?.Trim()——null 条件运算符 (?.) 用于安全访问。DisplayAlert——原生对话框。ItemsView.ItemsSource——绑定到集合。async/await 用于异步加载。MVVM(Model-View-ViewModel)架构推荐用于复杂项目。

移动开发中的 C#

C# 移动开发提供三种方法:.NET MAUI(跨平台 UI)、Xamarin(旧版)和 Unity(游戏)。.NET MAUI——新项目的推荐路径。C# 应用程序被编译为中间语言 (IL),NativeAOT (.NET MAUI) 或 Mono (Xamarin) 将其转换为原生 ARM 代码。iOS 需要 AOT 编译——Apple 政策禁止 JIT。

访问原生 API

.NET MAUI 通过接口提供统一的 API 来处理平台功能:IAccelerometer、IBarometer、IBattery、IConnectivity、IDeviceInfo、IFilePicker、IGeolocation、IMediaPicker、IPermissions、ISpeechRecognizer、IVibration。对于平台特定代码,使用条件编译(#if ANDROID、#if IOS)或分部类。

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($"位置错误:{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)。try-catch 处理平台异常。

C# 在移动设备上的性能

C# 在移动设备上展现出与 Android 上的 Java/Kotlin 和 iOS 上的 Swift 可比的性能。NativeAOT (.NET 8+) 将 C# 直接编译为原生代码,无需 IL 中间阶段——这可将启动时间减少 50% 并降低内存消耗。.NET MAUI 中的 GC 针对移动平台进行了优化,具有短暂停(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、WindowsAndroid、iOS、Windows、macOS、Tizen

.NET 平台和 CLR

.NET 平台——用于执行托管代码的生态系统,包括 CLR(Common Language Runtime)、BCL(基类库)、用于服务器开发的 ASP.NET Core 和用于移动应用程序的 .NET MAUI。.NET 8+——所有类型应用程序的统一平台:移动、桌面、Web、云、物联网、游戏(Unity)。

CLR——执行 CIL(公共中间语言)代码的虚拟机。C#、VB.NET、F# 被编译为 CIL。CLR 的 JIT 编译器在方法首次调用时将 CIL 转换为机器码。NativeAOT(预编译)在构建阶段将 CIL 编译为本机代码——非常适合 JIT 可能受限的移动平台(iOS)。

.NET 的垃圾回收器 GC——分代(第 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 设计器、托管和本机代码调试器、CPU/内存分析器。.NET SDK 包括 csc 编译器、dotnet CLI(dotnet new、dotnet build、dotnet publish、dotnet test)。

NuGet——.NET 包管理器,类似于 JS 的 npm。超过 300,000 个包,包括 CommunityToolkit.Maui(UI 组件)、SQLite-net(数据库)、Firebase Cloud Messaging、ZXing.Net.Maui(二维码)。.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 组件(Toast、Snackbar、Popup)。sqlite-net-pcl——本地数据库。Refit——基于接口的类型化 HTTP 客户端。dotnet build/publish 为所有平台构建应用程序。

常见问题

什么是 C#?

C#——微软(2000)推出的一种面向对象编程语言,运行在 .NET (CLR) 平台上。通过 Xamarin 和 .NET MAUI 用于移动开发。结合了严格的静态类型、自动内存管理 (GC)、LINQ、async/await 和泛型。在 TIOBE 指数(2026)中排名第 4。由 Anders Hejlsberg 开发。

Xamarin 和 .NET MAUI 有什么区别?

Xamarin——前身(2011-2024),将项目分为 Xamarin.Android 和 Xamarin.iOS。.NET MAUI(2022+)——具有通用 XAML 标记、Handler 架构替代 Renderer 和支持 5 个平台(iOS、Android、Windows、macOS、Tizen)的单一 .csproj 项目。Xamarin 已进入支持模式,新项目在 .NET MAUI 上创建。NativeAOT 仅在 .NET MAUI 中可用。

C# 如何在移动平台上工作?

C# 被编译为 CIL(公共中间语言),NativeAOT (.NET MAUI) 或 Mono (Xamarin) 将其转换为原生 ARM 代码。Android 使用 Mono 运行时 (Xamarin) 或 NativeAOT (.NET MAUI) 执行 IL。iOS 需要 AOT 编译——Apple 禁止 JIT。.NET MAUI 通过接口提供摄像头、GPS、传感器的统一 API 及平台实现。

C# 支持哪些数据类型?

C# 将类型分为值类型(int、double、bool、char、struct、enum——栈)和引用类型(string、class、interface、array、delegate、record——堆)。可为空类型(int?)允许值类型为 null。record(C# 9)——具有基于值的相等性的不可变引用类型。record struct(C# 10)——值类型版本。dynamic——动态类型化。var——编译器类型推断。

C# 移动开发使用哪些工具?

Visual Studio 2022(Windows)和 Visual Studio for Mac——具有 XAML 设计器、调试器和分析器的主要 IDE。.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#——微软面向 .NET 平台的面向对象语言,具有 GC、LINQ 和严格类型化
  • .NET MAUI——Xamarin 的继任者,具有单一项目、Handler 架构和 5 个平台
  • XAML——所有平台通用的声明式 UI 标记,使用 C# 代码后置
  • LINQ——用于集合、数据库和 XML 的内置查询语言,具有延迟求值
  • NativeAOT——预编译为本机代码,将启动时间减少 50%
  • NuGet——包管理器,拥有超过 300,000 个用于 .NET MAUI 和 Xamarin 的库
  • Visual Studio 和 dotnet CLI——构建、测试和发布的主要工具

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读