C#——微软推出的一种现代面向对象编程语言,是移动开发中 Xamarin 和 .NET MAUI 平台的基础。得益于统一的 .NET 生态系统,开发者可以使用 C# 和 XAML 的共享代码创建适用于 iOS 和 Android 的移动应用程序。根据 TIOBE 指数(2026),C# 在所有编程语言中受欢迎程度排名第 4。更多信息请参阅微软 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# 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.0 | 2007 | LINQ、Lambda | 简化集合和数据库操作 |
| 6.0 | 2015 | ?.(null 条件)、字符串插值 | 安全访问属性、可读字符串 |
| 8.0 | 2019 | 可为空引用类型、异步流 | Null 安全性、异步数据流 |
| 10 | 2021 | 记录结构、全局 using | 值类型、减少模板代码 |
| 12 | 2023 | 主构造函数、集合表达式 | 类和集合的简洁写法 |
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)将声明和初始化合并到一行中。
// 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——用于集合、数据库、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))。延迟执行:查询在迭代时执行,而非声明时。
// 针对集合的 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(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 映射到原生组件。
<!-- 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 方法。
// 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# 移动开发提供三种方法:.NET MAUI(跨平台 UI)、Xamarin(旧版)和 Unity(游戏)。.NET MAUI——新项目的推荐路径。C# 应用程序被编译为中间语言 (IL),NativeAOT (.NET MAUI) 或 Mono (Xamarin) 将其转换为原生 ARM 代码。iOS 需要 AOT 编译——Apple 政策禁止 JIT。
.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)。try-catch 处理平台异常。
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、Windows | Android、iOS、Windows、macOS、Tizen |
.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# 开发者工具包括 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——架构框架。
<!-- .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#——微软(2000)推出的一种面向对象编程语言,运行在 .NET (CLR) 平台上。通过 Xamarin 和 .NET MAUI 用于移动开发。结合了严格的静态类型、自动内存管理 (GC)、LINQ、async/await 和泛型。在 TIOBE 指数(2026)中排名第 4。由 Anders Hejlsberg 开发。
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# 被编译为 CIL(公共中间语言),NativeAOT (.NET MAUI) 或 Mono (Xamarin) 将其转换为原生 ARM 代码。Android 使用 Mono 运行时 (Xamarin) 或 NativeAOT (.NET MAUI) 执行 IL。iOS 需要 AOT 编译——Apple 禁止 JIT。.NET MAUI 通过接口提供摄像头、GPS、传感器的统一 API 及平台实现。
C# 将类型分为值类型(int、double、bool、char、struct、enum——栈)和引用类型(string、class、interface、array、delegate、record——堆)。可为空类型(int?)允许值类型为 null。record(C# 9)——具有基于值的相等性的不可变引用类型。record struct(C# 10)——值类型版本。dynamic——动态类型化。var——编译器类型推断。
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。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。