探索 C# 的进阶特性

news/2024/10/19 15:03:31/

随着 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/news/1540272.html

相关文章

网站建设完成后,多久需要升级迭代一次

网站建设完成后&#xff0c;一般每隔几个月就会进行一次迭代升级。以下是关于网站迭代周期和原因的具体分析&#xff1a; 更新频率&#xff1a;网站在建设完成后&#xff0c;一般每隔几个月就会进行一次迭代升级。这种周期性的更新有助于保持网站的现代感和竞争力。更新目的&a…

微信小程序定位判断点位是否在某个范围内(腾讯地图转百度地图)

业务:比较微信小程序定位是否在系统设置的某个位置的某个范围内 问题:微信小程序的定位是拿的腾讯地图的经纬度(假设为点A),系统设置的某个位置是百度地图的经纬度(假设为点B),需要判断点A是否在点B的Range(米)范围内 解决方案:将腾讯点A的经纬度转换为百度地图的经纬度后再进行…

iptables限速规则

环境&#xff1a; iptables服务器&#xff1a;172.16.12.33 client&#xff1a;192.168.1.2 1、在防火墙上配置客户端的下载速度是1M/s &#xff08;1个包是1.3KB&#xff09; #限速客户端每秒的下载速度是1024KB&#xff0c;超出限制的流量就丢弃 [rootiptables-172-16-12-…

Web安全常见问题

OSI七层模型和HTTP请求 OSI 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层 五层协议 物理层-数据链路层-网络层-传输层-应用层 HTTP请求类型&#xff1a; GET 请求的数据在url头 POST 请求的数据在请求体 PUT 更新资源 DELETE 删除 CONNECT http/1.1协议中预留…

HIKROBOT_SDK_text1——机器人控制权

1.切换示教员&#xff0c;然后在示教器释放掉控制权 2.连接机器人代码 #include <memory> #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h>#include "MP_Public_API.h"int main() {int64_t llRet…

自动化生成工作流?英伟达提出ComfyGen:通过LLM来匹配给定的文本提示与合适的工作流程

ComfyGen的核心在于通过LLM来匹配给定的文本提示与合适的工作流程。该方法从500个来自用户的多样化提示生成图像&#xff0c;随后使用一系列美学预测模型对生成结果进行评分。这些评分与相应的工作流程形成了一个训练集&#xff0c;包含提示、工作流程及其得分的三元组。 然后…

Nature Communications 英国伦敦大学等提出仿生自适应多平面触觉系统,实现机械与振动双重感知结合

触觉&#xff0c;作为人类感知外界并与之互动的重要方式&#xff0c;赋予了人类以辨识物体多重特性&#xff08;诸如纹理、硬度、可塑性及重量&#xff09;与捕捉微妙线索&#xff08;例如感知心跳或精准定位动脉振动&#xff09;的能力。这一感官机制不仅深化了人类对周围世界…

大厂面试真题-说说Redis的cluster模式的故障转移和自动恢复

说这个之前要先介绍一下Gossip Gossip 在Redis中&#xff0c;Gossip是一种用于节点之间通信和信息传播的协议。以下是关于Redis中Gossip的详细解释&#xff1a; 一、定义与功能 定义&#xff1a; Gossip协议&#xff0c;又称流言协议或八卦协议&#xff0c;是一种分布式系统…