探索 C# 的进阶特性

server/2024/10/19 10:10:43/

随着 C# 语言的不断演进,越来越多的特性被引入,提升了代码的可读性和性能。这些进阶特性为开发者提供了更多简洁而强大的工具,用来编写高效、优雅的代码。本文将介绍 C# 中的一些重要进阶特性,包括属性模式匹配、异常过滤器、记录类型、表达式体成员、Span<T> 与 Memory<T>


1. 属性模式匹配

属性模式匹配 是 C# 8.0 引入的一项功能,它允许开发者基于对象的属性进行模式匹配。在此基础上,开发者可以根据条件检查对象的状态或类型,编写更加简洁和表达力强的代码。

示例:属性模式匹配

public class Person
{public string Name { get; set; }public int Age { get; set; }
}public static string GetPersonCategory(Person person) =>person switch{{ Age: < 18 } => "Minor",{ Age: >= 18 and <= 65 } => "Adult",{ Age: > 65 } => "Senior",_ => "Unknown"};

在这个例子中,switch 表达式使用属性模式匹配 Age 属性来判断一个人是未成年、成年人还是老年人。这种模式匹配可以避免冗长的 if-else 语句,并使代码更加清晰。


2. 异常过滤器

异常过滤器 是一种在异常处理过程中增加条件判断的特性。通过异常过滤器,可以在 catch 语句中增加条件,确保只有特定情况下才会捕获异常,避免过度捕获。

示例:异常过滤器

try
{// 可能抛出异常的代码
}
catch (InvalidOperationException ex) when (ex.Message.Contains("Critical"))
{Console.WriteLine("Critical error occurred.");
}

在这个示例中,catch 语句中使用了 when 关键字来过滤异常,只有当 InvalidOperationException 的消息包含 "Critical" 字符串时才会捕获异常。异常过滤器提高了异常处理的灵活性和准确性。


3. 记录类型(Record Types)

记录类型(Record Types) 是 C# 9.0 引入的一个新特性,主要用于不可变数据模型的创建。记录类型非常适合定义简单的 DTO(数据传输对象)或不可变对象。记录类型默认实现了值相等性和不可变性。

示例:记录类型

public record Person(string Name, int Age);var person1 = new Person("Alice", 30);
var person2 = new Person("Alice", 30);Console.WriteLine(person1 == person2);  // 输出:True

在上面的示例中,Person 记录类型具有简洁的语法,且默认实现了值相等性。即使 person1 和 person2 是不同的实例,由于它们的属性相同,因此它们是相等的(与 class 不同,class 的比较是基于引用的)。

记录类型还支持通过 with 表达式进行属性的部分更新:

var person3 = person1 with { Age = 31 };
Console.WriteLine(person3.Age);  // 输出:31

4. 表达式体成员

表达式体成员 提供了一种简化方法定义属性、方法或构造函数的方式,特别适用于只包含单行逻辑的场景。它通过 => 符号将方法体简化为一个表达式。

示例:表达式体成员

public class Circle
{public double Radius { get; }public Circle(double radius) => Radius = radius;public double Area => Math.PI * Radius * Radius;public override string ToString() => $"Circle with Radius {Radius}";
}

在这个例子中,Circle 类使用了表达式体构造函数和属性 Area,以及 ToString 方法。与传统的写法相比,表达式体成员让代码更加简洁直观。


5. Span<T> 与 Memory<T>

Span<T> 和 Memory<T> 是 C# 中用于高效处理内存的结构,它们提供了更轻量的方式来操作数组或内存片段,不需要进行额外的内存分配。Span<T> 是栈分配的,而 Memory<T> 则可以用于托管堆或非托管堆的内存访问。

Span<T> 示例

Span<int> numbers = stackalloc int[] { 1, 2, 3, 4, 5 };
numbers[0] = 10;foreach (var num in numbers)
{Console.WriteLine(num);  // 输出:10, 2, 3, 4, 5
}

在这个例子中,stackalloc 在栈上分配了内存,Span<T> 提供了对该内存的高效访问,而不需要像数组一样分配到堆上。Span<T> 的高效性使它非常适合对性能要求较高的场景,比如处理大规模数组、字符串分片等。

Memory<T> 示例

Memory<int> memory = new int[] { 1, 2, 3, 4, 5 };
var slice = memory.Slice(1, 3);foreach (var num in slice.Span)
{Console.WriteLine(num);  // 输出:2, 3, 4
}

Memory<T> 与 Span<T> 类似,但可以跨越栈和堆,适合异步方法或持久性数据操作场景。它们与 .NET 的高效内存处理机制紧密结合,减少了内存分配和复制的开销。


结论

C# 的这些进阶特性提升了语言的表现力和性能,帮助开发者编写更简洁、高效的代码:

  • 属性模式匹配 简化了对象属性的条件判断,减少了冗长的 if-else 语句。
  • 异常过滤器 提供了灵活的条件捕获机制,避免了不必要的异常处理。
  • 记录类型 引入了不可变对象,简化了值相等性和对象更新的处理。
  • 表达式体成员 提供了一种更简洁的方式定义属性和方法。
  • Span<T> 与 Memory<T> 提供了高效的内存管理机制,减少了堆分配和内存开销。

通过掌握这些进阶特性,开发者可以写出更优雅、性能更高的 C# 代码。如果你有进一步的问题或需要更详细的示例,欢迎继续探讨!


这篇博客为你介绍了 C# 的进阶特性。如果有任何问题或者需要更多的说明,欢迎联系我!


http://www.ppmy.cn/server/133017.html

相关文章

学习索引时想到的问题

问题 在查询时&#xff0c;根据两个单独进行索引的字段进行查询&#xff0c;他的查询过程是什么样的&#xff1f; 答&#xff1a;数据库会先评估怎样使用索引是最快的&#xff08;两个单独的索引和一个包含两个字段的复合索引会使用复合索引而不是用两个单独的索引,也有可能会…

用Python构建动态折线图:实时展示爬取数据的指南

背景/引言 随着大数据和人工智能的不断发展&#xff0c;实时数据分析变得越来越关键&#xff0c;尤其是在金融市场中。股市数据的实时可视化可以帮助投资者快速做出决策&#xff0c;避免错失良机。Python 凭借其强大的数据处理能力和丰富的可视化库&#xff0c;成为分析和展示…

外包干了3周,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入武汉某软件公司&#xff0c;干了差不多3个星期的功能测试&#xff0c;那年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了3周的功…

Flink CDC同步mysql数据到doris

前置参考 flink快速安装&#xff1a;Flink入门-CSDN博客 doris快速安装&#xff1a;Apache Doris快速安装-CSDN博客 Flink CDC简介 Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;。 该工具使得用户能…

C语言_指针_进阶

引言&#xff1a;在前面的c语言_指针初阶上&#xff0c;我们了解了简单的指针类型以及使用&#xff0c;下面我们将进入更深层次的指针学习&#xff0c;对指针的理解会有一个极大的提升。从此以后&#xff0c;指针将不再是难点&#xff0c;而是学习底层语言的一把利器。 本章重点…

《linux运维》之如何使用putty软件完成宿主机到虚拟机传递文件

背景 当虚拟机不具备外网环境时&#xff0c;无法使用下载及使用Xshell自带的xftp工具时&#xff0c;可使用Putty软件完成宿主机至虚拟机的文件传输 使用过程 1&#xff09; 在Putty文件夹目录下输入cmd 2&#xff09;进入命令行模式&#xff0c;使用命令 pscp 3) 将所传输的…

go语言实现简单的grpc客户端服务端案例

在 Go 中实现一个简单的 gRPC 客户端和服务端&#xff0c;可以按照以下步骤进行。 1. 安装 gRPC 和相关工具 首先&#xff0c;需要安装 protobuf 编译器和 protoc-gen-go 插件&#xff1a; # 安装protoc brew install protobuf# 安装protoc-gen-go和protoc-gen-go-grpc插件 …

【AIGC】让AI像人一样思考和使用工具,reAct机制详解

​ reAct机制详解 reAct是什么reAct的关键要素reAct的思维过程reAct的代码实现查看效果引入依赖&#xff0c;定义模型定义相关工具集合工具创建代理启动测试完整代码 思考 reAct是什么 reAct的核心思想是将**推理&#xff08;Reasoning&#xff09;和行动&#xff08;Acting&…