C# 8.0 随着 .NET Core 3.0 和 .NET Standard 2.1 的推出而发布,带来了一系列旨在提高代码安全性、简洁性和表达力的新特性。
下面是 C# 8.0 的主要新增特性及示例:
1️⃣ 可空引用类型(Nullable Reference Types)
- 目的:在编译期提供对引用类型是否可为 null 的检查,帮助开发者提前发现潜在的 NullReferenceException 风险。
- 使用方式:启用可空引用类型后,所有引用类型默认被视为不可为 null;如果允许为 null,则需要在类型后加上
?
。
示例:
#nullable enable
public class Person
{
// 默认情况下,Name 被认为不能为 null
public string Name { get; set; }
// 如果允许为 null,则需标记为可空
public string? Nickname { get; set; }
}
#nullable disable
编译器会根据变量的可空性发出警告,帮助你在代码中更安全地处理 null 值。
2️⃣ 异步流(Async Streams)
- 作用:提供了以异步方式迭代数据流的能力,通过
IAsyncEnumerable<T>
接口和await foreach
语法,方便处理异步数据源(例如流式数据、实时数据)。
示例:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class AsyncStreamDemo
{
// 定义一个返回异步流的方法
public async IAsyncEnumerable<int> GenerateSequenceAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(100); // 模拟异步操作
yield return i;
}
}
public async Task PrintSequenceAsync()
{
// 使用 await foreach 遍历异步流
await foreach (var number in GenerateSequenceAsync())
{
Console.WriteLine(number);
}
}
}
这样,处理异步数据流的代码就和同步代码十分相似,极大地简化了异步编程模型。
3️⃣ 索引和范围(Indices and Ranges)
- 索引运算符(Index Operator):通过
^
符号支持从集合末尾开始的反向索引,例如^1
表示最后一个元素。 - 范围运算符(Range Operator):使用
..
符号指定集合的子区间,方便提取数组或 Span 的一部分。
示例:
int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int lastElement = numbers[^1]; // 获取最后一个元素:9
int[] subArray = numbers[2..5]; // 获取索引 2 到 4 的子数组:{2, 3, 4}
这种语法使得代码更直观,尤其在处理集合数据时非常有用。
4️⃣ Switch 表达式(Switch Expressions)
- 作用:提供了一种更简洁的表达式形式来替代传统的 switch 语句,支持模式匹配,能够直接返回结果。
示例:
public string GetDayType(DayOfWeek day) =>
day switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "Weekend",
_ => "Weekday"
};
Switch 表达式不仅让代码更加紧凑,同时也使得分支逻辑更加清晰易读。
5️⃣ 默认接口方法(Default Interface Methods)
- 目的:允许在接口中为方法提供默认实现,这样在扩展接口时无需破坏现有的实现。
示例:
public interface ILogger
{
void Log(string message);
// 默认实现:在接口中定义默认方法
void LogError(string message) => Log($"Error: {message}");
}
public class ConsoleLogger : ILogger
{
public void Log(string message) => Console.WriteLine(message);
// 无需实现 LogError,直接使用接口默认实现
}
这为接口的演进提供了更大的灵活性,同时也支持多重继承的场景。
6️⃣ using 声明(Using Declarations)
- 作用:允许在作用域内声明资源对象,并在作用域结束时自动调用
Dispose
方法,而不需要额外的嵌套代码块。
示例:
using var fileStream = new FileStream("file.txt", FileMode.Open);
// 在当前方法作用域结束时,fileStream 自动调用 Dispose() 方法
这种写法使得资源管理更加简洁,代码层次也更清晰。
7️⃣ 模式匹配增强
- 增强模式匹配:C# 8.0 对模式匹配进行了进一步扩展,支持属性模式、元组模式和位置模式等,使得在复杂数据类型匹配和提取数据时更加灵活和简洁。
示例:
public string DescribeShape(object shape) =>
shape switch
{
// 属性模式:匹配 Circle 对象并获取 Radius 属性
Circle { Radius: var r } when r > 10 => "Large Circle",
// 元组模式:匹配具有两个属性的对象
(double width, double height) => "Rectangle",
_ => "Unknown Shape"
};
// 假设 Circle 类定义如下
public class Circle
{
public double Radius { get; set; }
}
这些模式匹配特性使得代码能够在一个表达式中处理多种条件,更加直观。
总结
C# 8.0 的改进重点在于:
- 提高代码安全性:通过可空引用类型减少 null 引用错误。
- 增强异步编程模型:异步流 (
IAsyncEnumerable<T>
) 与await foreach
为异步数据处理提供了优雅方案。 - 简化集合操作:索引和范围运算符让数组及其他集合的切片操作变得直观。
- 提升表达力:Switch 表达式和增强的模式匹配使得条件判断更简洁、易读。
- 扩展接口能力:默认接口方法为接口演进带来灵活性。
- 优化资源管理:using 声明减少了冗余代码。
这些新特性不仅提升了开发效率,还让 C# 语言更加现代化。
如果你在整理 C# 版本演进,C# 8.0 的这些特性无疑是重要的里程碑,值得深入学习和实践。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南