摘要:本文聚焦于现代C#中的几个重要特性,包括模式匹配增强、记录类型(record)、顶级语句和可空引用类型。通过详细的理论阐述、丰富的实操流程以及完整的代码示例,帮助开发者深入理解和掌握这些特性,从而在实际项目中更高效地运用现代C#进行开发,提升代码的可读性、可维护性和安全性。
文章目录
【C#基础:第六部分 综合应用】现代C#特性
关键词
一、引言
二、模式匹配增强
2.1 模式匹配概述
2.2 现代C#中的模式匹配增强
2.2.1 关系模式和逻辑模式
2.2.2 位置模式
2.2.3 属性模式
2.3 实操流程
2.4 注意事项
三、记录类型(record)
3.1 记录类型概述
3.2 记录类型的定义和使用
3.2.1 定义记录类型
3.2.2 创建记录类型的实例
3.2.3 记录类型的相等性比较
3.2.4 记录类型的复制和修改
3.2.5 记录类型的解构
3.3 实操流程
3.4 注意事项
四、顶级语句
4.1 顶级语句概述
4.2 顶级语句的使用
4.2.1 简单的顶级语句示例
4.2.2 引入命名空间和使用变量
4.2.3 与其他代码结合使用
3.3 实操流程
3.4 注意事项
五、可空引用类型
5.1 可空引用类型概述
5.2 可空引用类型的使用
5.2.1 启用可空引用类型
5.2.2 定义可空引用类型
5.2.3 空值检查
5.2.4 空值传播运算符
5.2.5 非空断言运算符
5.3 实操流程
5.4 注意事项
六、综合实践案例
6.1 案例背景
6.2 代码实现
6.3 代码解释
6.4 实操流程
七、总结与展望
7.1 总结
7.2 展望
八、参考文献
九、附录
9.1 代码仓库
9.2 常见问题解答

【C#基础:第六部分 综合应用】现代C#特性
关键词
现代C#;模式匹配增强;记录类型;顶级语句;可空引用类型
一、引言
C#作为一门不断发展的编程语言,在各个版本的迭代中引入了许多新的特性,以满足开发者日益增长的需求和提升开发效率。现代C#特性不仅让代码编写更加简洁、高效,还增强了代码的可读性和安全性。本文将详细介绍模式匹配增强、记录类型(record)、顶级语句和可空引用类型这几个重要特性,通过理论与实践相结合的方式,帮助读者全面掌握这些特性的使用方法。
二、模式匹配增强
2.1 模式匹配概述
模式匹配是C#中一种强大的特性,它允许开发者根据数据的形状和内容进行条件判断和数据提取。在早期的C#版本中,模式匹配主要用于switch语句和is表达式,而在现代C#中,模式匹配得到了进一步的增强,提供了更多的模式和更灵活的语法。
2.2 现代C#中的模式匹配增强
2.2.1 关系模式和逻辑模式
关系模式允许使用比较运算符(如<、>、<=、>=)进行模式匹配,逻辑模式则允许使用逻辑运算符(如and、or、not)组合多个模式。
// 示例:使用关系模式和逻辑模式判断数字范围
int number = 25;
string result = number switch
{
< 10 => "小于10",
>= 10 and < 20 => "在10到20之间",
>= 20 and < 30 => "在20到30之间",
_ => "大于等于30"
};
Console.WriteLine(result);
在上述代码中,switch表达式使用了关系模式和逻辑模式来判断number的范围,并根据不同的范围返回相应的结果。
2.2.2 位置模式
位置模式允许根据元组或类型的位置来匹配数据。可以使用with关键字来修改匹配对象的属性。
// 定义一个包含位置属性的类型
public class Point
{
public int X {
get; }
public int Y {
get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
// 解构方法,用于位置模式匹配
public void Deconstruct(out int x, out int y)
{
x = X;
y = Y;
}
}
// 示例:使用位置模式匹配Point对象
Point point = new Point(3, 4);
if (point is (3, 4))
{
Console.WriteLine("点的坐标是(3, 4)");
}
// 使用with关键字修改匹配对象的属性
Point newPoint = point with {
X = 5 };
Console.WriteLine($"新点的坐标是({
newPoint.X}, {
newPoint.Y})");
在上述代码中,Point类定义了一个解构方法,用于支持位置模式匹配。通过位置模式可以直接判断Point对象的坐标是否符合指定的值。同时,使用with关键字可以创建一个新的Point对象,其中X属性被修改为5。
2.2.3 属性模式
属性模式允许根据对象的属性值进行匹配。
// 定义一个包含属性的类
public class Person
{
public string Name {
get; set; }
public int Age {
get; set; }
}
// 示例:使用属性模式匹配Person对象
Person person = new Person {
Name = "Alice", Age = 25 };
if (person is {
Name: "Alice", Age: 25 })
{
Console.WriteLine("找到名为Alice且年龄为25的人");
}
在上述代码中,使用属性模式判断Person对象的Name属性是否为”Alice”,Age属性是否为25。
2.3 实操流程
创建项目:打开Visual Studio,创建一个新的C#控制台应用程序项目。
编写代码:将上述示例代码复制到Program.cs文件中。
运行程序:按下F5键运行程序,观察输出结果。
2.4 注意事项
模式匹配的顺序很重要,在switch表达式中,先匹配的模式会优先被执行。
当使用逻辑模式组合多个模式时,要注意运算符的优先级,避免出现意外的结果。
三、记录类型(record)
3.1 记录类型概述
记录类型(record)是C# 9.0引入的一种新类型,它主要用于表示不可变的数据。记录类型自动提供了相等性比较、复制和解构等功能,减少了开发者编写样板代码的工作量。
3.2 记录类型的定义和使用
3.2.1 定义记录类型
可以使用record关键字定义一个记录类型。
// 定义一个简单的记录类型
public record PersonRecord(string Name, int Age);
在上述代码中,PersonRecord是一个记录类型,它包含两个属性:Name和Age。
3.2.2 创建记录类型的实例
创建记录类型的实例与创建普通类的实例类似。
// 创建PersonRecord的实例
PersonRecord person1 = new PersonRecord("Bob", 30);
3.2.3 记录类型的相等性比较
记录类型自动实现了相等性比较,比较的是记录类型的所有属性值。
PersonRecord person2 = new PersonRecord("Bob", 30);
bool areEqual = person1 == person2;
Console.WriteLine($"person1和person2是否相等: {
areEqual}");
3.2.4 记录类型的复制和修改
可以使用with关键字复制记录类型的实例,并修改其中的属性。
PersonRecord person3 = person1 with {
Age = 31 };
Console.WriteLine($"person3的年龄是: {
person3.Age}");
3.2.5 记录类型的解构
记录类型自动支持解构操作,可以将记录类型的属性值解构到多个变量中。
var (name, age) = person1;
Console.WriteLine($"解构后的姓名: {
name}, 年龄: {
age}");
3.3 实操流程
创建项目:打开Visual Studio,创建一个新的C#控制台应用程序项目。
编写代码:将上述示例代码复制到Program.cs文件中。
运行程序:按下F5键运行程序,观察输出结果。
3.4 注意事项
记录类型默认是不可变的,使用with关键字创建的是一个新的记录实例,而不是修改原实例。
记录类型的相等性比较是基于值的比较,而不是引用的比较。
四、顶级语句
4.1 顶级语句概述
顶级语句是C# 9.0引入的一种新特性,它允许开发者在不定义Main方法的情况下编写程序的入口代码。使用顶级语句可以使代码更加简洁,减少样板代码。
4.2 顶级语句的使用
4.2.1 简单的顶级语句示例
// 简单的顶级语句示例
Console.WriteLine("Hello, World!");
在上述代码中,直接在文件中编写了Console.WriteLine语句,而不需要定义Main方法。
4.2.2 引入命名空间和使用变量
using System;
int number = 10;
Console.WriteLine($"数字是: {
number}");
在上述代码中,引入了System命名空间,并定义了一个变量number,然后将其输出到控制台。
4.2.3 与其他代码结合使用
顶级语句可以与类、方法等其他代码结合使用。
using System;
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
var calculator = new Calculator();
int result = calculator.Add(3, 5);
Console.WriteLine($"计算结果是: {
result}");
3.3 实操流程
创建项目:打开Visual Studio,创建一个新的C#控制台应用程序项目。
编写代码:将上述示例代码复制到Program.cs文件中。
运行程序:按下F5键运行程序,观察输出结果。
3.4 注意事项
一个项目中只能有一个文件使用顶级语句。
顶级语句的执行顺序是按照代码的书写顺序进行的。
五、可空引用类型
5.1 可空引用类型概述
可空引用类型是C# 8.0引入的一种新特性,它允许开发者明确指定引用类型变量可以为null。在早期的C#版本中,引用类型变量默认可以为null,这可能会导致空引用异常。可空引用类型通过编译时检查,帮助开发者减少空引用异常的发生。
5.2 可空引用类型的使用
5.2.1 启用可空引用类型
在项目文件(.csproj)中添加以下代码来启用可空引用类型:
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
5.2.2 定义可空引用类型
在类型后面加上?来定义可空引用类型。
string? nullableString = null;
5.2.3 空值检查
在使用可空引用类型的变量时,需要进行空值检查。
if (nullableString != null)
{
Console.WriteLine($"字符串长度是: {
nullableString.Length}");
}
5.2.4 空值传播运算符
可以使用空值传播运算符?.来简化空值检查。
int? length = nullableString?.Length;
if (length.HasValue)
{
Console.WriteLine($"字符串长度是: {
length.Value}");
}
5.2.5 非空断言运算符
在确定可空引用类型的变量不为null时,可以使用非空断言运算符!来告诉编译器该变量不为null。
string? nullableString2 = "Hello";
int length2 = nullableString2!.Length;
Console.WriteLine($"字符串长度是: {
length2}");
5.3 实操流程
创建项目:打开Visual Studio,创建一个新的C#控制台应用程序项目。
启用可空引用类型:在项目文件(.csproj)中添加上述启用可空引用类型的代码。
编写代码:将上述示例代码复制到Program.cs文件中。
运行程序:按下F5键运行程序,观察输出结果。
5.4 注意事项
非空断言运算符!需要谨慎使用,因为如果变量实际上为null,会导致运行时的空引用异常。
可空引用类型主要是在编译时进行检查,运行时仍然需要进行适当的空值处理。
六、综合实践案例
6.1 案例背景
假设我们要开发一个简单的图书管理系统,需要使用上述现代C#特性来实现图书的添加、查询和显示功能。
6.2 代码实现
// 启用可空引用类型
#nullable enable
// 记录类型表示图书
public record Book(string Title, string? Author, int Year);
// 图书管理类
public class Library
{
private List<Book> books = new List<Book>();
// 添加图书
public void AddBook(Book book)
{
books.Add(book);
}
// 根据书名查询图书
public Book? FindBook(string title)
{
return books.FirstOrDefault(b => b.Title == title);
}
// 显示所有图书
public void DisplayBooks()
{
foreach (var book in books)
{
Console.WriteLine($"书名: {
book.Title}, 作者: {
book.Author ?? "未知"}, 出版年份: {
book.Year}");
}
}
}
// 顶级语句作为程序入口
using System;
var library = new Library();
// 添加图书
library.AddBook(new Book("C#高级编程", "John Doe", 2023));
library.AddBook(new Book("ASP.NET Core实战", null, 2024));
// 显示所有图书
Console.WriteLine("所有图书信息:");
library.DisplayBooks();
// 查询图书
string searchTitle = "C#高级编程";
var foundBook = library.FindBook(searchTitle);
if (foundBook is not null)
{
Console.WriteLine($"找到图书: {
foundBook.Title}");
}
else
{
Console.WriteLine($"未找到图书: {
searchTitle}");
}
6.3 代码解释
记录类型Book:用于表示图书的信息,包括书名、作者(可空)和出版年份。
图书管理类Library:包含添加图书、查询图书和显示所有图书的方法。
顶级语句:作为程序的入口,创建Library对象,添加图书,显示图书信息,并进行图书查询。
可空引用类型:在Book类中,Author属性被定义为可空引用类型,在使用时进行了空值处理。
6.4 实操流程
创建项目:打开Visual Studio,创建一个新的C#控制台应用程序项目。
启用可空引用类型:在项目文件(.csproj)中添加启用可空引用类型的代码。
编写代码:将上述示例代码复制到Program.cs文件中。
运行程序:按下F5键运行程序,观察输出结果。
七、总结与展望
7.1 总结
本文详细介绍了现代C#中的几个重要特性,包括模式匹配增强、记录类型(record)、顶级语句和可空引用类型。通过丰富的代码示例和实操流程,展示了这些特性的使用方法和优势。模式匹配增强让代码的条件判断更加灵活,记录类型减少了样板代码,顶级语句使代码更加简洁,可空引用类型提高了代码的安全性。
7.2 展望
随着C#的不断发展,未来可能会引入更多的新特性,进一步提升开发者的开发体验和代码质量。开发者应该持续关注C#的发展动态,不断学习和掌握新的特性,以更好地应对日益复杂的软件开发需求。
八、参考文献
《C#高级编程》(第12版)
Microsoft官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/
C#语言规范:https://github.com/dotnet/csharplang
九、附录
9.1 代码仓库
本文的示例代码可以在GitHub仓库中找到,方便读者参考和学习。
9.2 常见问题解答
问:模式匹配增强中的逻辑模式and、or、not的优先级是怎样的?
答:not的优先级最高,其次是and,最后是or。可以使用括号来明确指定运算的优先级。
问:记录类型和普通类有什么区别?
答:记录类型主要用于表示不可变的数据,自动提供了相等性比较、复制和解构等功能,减少了样板代码。而普通类需要开发者手动实现这些功能。
问:顶级语句和Main方法可以同时存在吗?
答:不可以,一个项目中只能有一个程序入口,如果使用了顶级语句,就不能再定义Main方法。
通过本文的学习,希望读者能够深入理解和掌握现代C#的这些重要特性,在实际项目中灵活运用,提高开发效率和代码质量。

















暂无评论内容