当前位置: 首页 > news >正文

.NET9 - 新功能体验(二)

书接上回,我们继续来聊聊.NET9和C#13带来的新变化。

在这里插入图片描述

01、新的泛型约束 allows ref struct

这是在 C# 13 中,引入的一项新的泛型约束功能,允许对泛型类型参数应用 ref struct 约束。

可能这样说不够直观,简单来说就是Span、ReadOnlySpan类型,我们直接看下面的代码示例:

在这里插入图片描述

在没有新的约束allows ref struct之前,Span是不能当参数传入的,直接编译错误,但是有了新约束则就可以支持Span参数了。

因此C# 13 中引入了 where T : allows ref struct 泛型约束后使得我们可以对泛型参数类型进行更加精细的控制。通过这个特性,泛型方法或类就可以接受 ref struct 类型,如 Span 、ReadOnlySpan等,因为这些类型是在栈上分配内存,能够提供更高效的内存管理和更快的执行速度,所以这个新特性特别适用于高性能、内存密集型的泛型方法和类,可以有效避免堆分配和垃圾回收的开销。

02、ref struct接口

在 C# 13 之前,ref struct 是无法实现接口的。 从 C# 13 开始,ref struct可实现接口,但必须遵循 ref 安全性规则。 例如,由于需要装箱转换,因此无法将 ref struct 类型转换为接口类型。

在这里插入图片描述

如上图,ref struct类型可以实现IInterface接口,但是当用IInterface接口去接收RefStructInterface类型时则直接编译报错,无论直接接收还是强制转换都是不支持的。

03、在异步方法中使用ref struct

从C# 13开始,ref struct可以在异步方法中使用,但是有一个限制:它们不能在与 await 表达式同一个代码块中交互。这是为了避免 ref struct在跨越异步操作时引发内存安全问题,因为 ref struct 类型的实例通常存储在栈上,并且不能在异步操作中跨越栈帧。

下面代码是在异步方法中使用ref struct示例:

ref int Process(ref int x)
{return ref x;
}
//在异步方法中使用ref
async Task RefInAsync()
{var value = 0;await Task.Delay(0);ref var local = ref Process(ref value);
}

04、在迭代器中使用ref struct

从 C# 13 开始,允许在迭代器方法中使用 ref struct,前提是满足以下条件:不能在包含 yield return 的代码段中使用它们。这是因为yield return 语句会导致方法的执行暂停并在以后继续执行。如果在这期间使用了ref struct,可能会导致这些类型的生命周期管理出现问题(例如跨越栈帧的切换)。为了避免这种问题,C# 13 规定,如果要在迭代器方法中使用 ref struct,则不能在 yield return 语句所在的代码段中操作它们。

下面是在迭代器中使用ref struct示例代码:

ref int Process(ref int x)
{return ref x;
}
//在迭代器中使用ref
IEnumerable<int> RefInIterator(int[] array)
{for (var i = 0; i < array.Length; i++){ref var v = ref Process(ref array[i]);yield return v;}
}

05、部分属性、部分索引器

早在C#2就引入了部分类,在C#3引入了部分方法,到现在C#13又新增了部分属性和部分索引器。

这一改进这意味着允许属性和索引器可以跨越多个部分进行声明和实现。这给自动生成代码或分离关注点带来了极大便利,也更加灵活地生成和管理属性代码,特别适用于与源代码生成器等工具结合使用的场景。

以下是 C# 13 中属性支持partial的示例:

public partial class PartialExamples
{//部分属性public partial int Capacity { get; set; }//部分索引器public partial string this[int index] { get; set; }//部分方法public partial string? TryGetItemAt(int index);
}
public partial class PartialExamples
{private List<string> _items = ["one", "two", "three", "four", "five"];//部分属性public partial int Capacity{get => _items.Count;set{if ((value != _items.Count) && (value >= 0)){_items.Capacity = value;}}}//部分索引器public partial string this[int index]{get => _items[index];set => _items[index] = value;}//部分方法public partial string? TryGetItemAt(int index){if (index < _items.Count){return _items[index];}return null;}
}

06、foreach 支持Index

相信很多人都遇到过想要在foreach的时候获取集合元素当前索引,一般两种选择,一种自己维护一个变量,一种直接改用for。

而.NET9开始总算改变了这一现状,可以在foreach时候同时获取到当前元素及其索引。

我们下面看看Index()方法给我们带来了多大便利,代码如下:

//.NET 9 之前public void Loop(){List<string> items = ["张三", "李四", "王五"];var idx = 0;foreach (var item in items){idx++;Console.WriteLine($"第{idx}个人名字是:{item}");}}//.NET 9public void LoopNew(){List<string> items = ["张三", "李四", "王五"];//直接获取索引、元素foreach ((int Index, string Item) in items.Index()){Console.WriteLine($"第{Index + 1}个人名字是:{Item}");}}//.NET 9public void LoopNew2(){List<string> items = ["张三", "李四", "王五"];//先获取元组后,再获取索引、元素foreach (var item in items.Index()){Console.WriteLine($"第{item.Index + 1}个人名字是:{item.Item}");}}

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner

相关文章:

.NET9 - 新功能体验(二)

书接上回&#xff0c;我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中&#xff0c;引入的一项新的泛型约束功能&#xff0c;允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观&#xff0c;简单来说就是Span、ReadO…...

map和redis关系

Map 和 Redis 都是用于存储和管理数据的工具&#xff0c;但它们在用途、实现和应用场景上有所不同。下面详细解释 Map 和 Redis 之间的关系和区别。 1. Map 数据结构 定义 Map 是一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。每个键都是…...

《数据结构》学习系列——图(中)

系列文章目录 目录 图的遍历深度优先遍历递归算法堆栈算法 广度优先搜索 拓扑排序定义定理算法思想伪代码 关键路径基本概念关键活动有关量数学公式伪代码时间复杂性 图的遍历 从给定连通图的某一顶点出发&#xff0c;沿着一些边访问遍图中所有的顶点&#xff0c;且使每个顶点…...

探索Python的HTTP之旅:揭秘Requests库的神秘面纱

文章目录 **探索Python的HTTP之旅&#xff1a;揭秘Requests库的神秘面纱**第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests库是什么&#xff1f;第三部分&#xff1a;如何安装Requests库&#xff1f;第四部分&#xff1a;Requests库的五个简单函数使用方法第五部分&…...

Python 爬虫从入门到(不)入狱学习笔记

爬虫的流程&#xff1a;从入门到入狱 1 获取网页内容1.1 发送 HTTP 请求1.2 Python 的 Requests 库1.2 实战&#xff1a;豆瓣电影 scrape_douban.py 2 解析网页内容2.1 HTML 网页结构2.2 Python 的 Beautiful Soup 库 3 存储或分析数据&#xff08;略&#xff09; 一般爬虫的基…...

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…...

wp the_posts_pagination 与分类页面搭配使用

<ul> <?php while( have_posts() ) : the_post(); <li > <a href"<?php the_permalink(); ?>"> <?php xizhitbu_get_thumbnail(thumb-pro); ?> </a> <p > <a href&q…...

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!

在Python开发中&#xff0c;字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中&#xff0c;split()函数无疑是最为重要和常用的一个。无论你是Python新手&#xff0c;还是经验丰富的开发者&#xff0c;深入理解并熟练运用split()方法&#xff0c;都将大大提升…...

免费实用在线AI工具集合 - 加菲工具

免费在线工具-加菲工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/h…...

正则表达式灾难:重新认识“KISS原则”的意义

RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门&#xff0c;从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗&#xff1f; 把业务逻辑写入数据库&#xff0c;重新定义简单与效率。…...

eNSP-缺省路由配置

缺省路由是一种特殊的静态路由&#xff0c;其目的地址为0.0.0.0&#xff0c;子网掩码为0.0.0.0。 1.拓扑图搭建 2.配置路由器 AR2 <Huawei>sys #进入系统视图 [Huawei]ip route-static 0.0.0.0 0.0.0.0 192.168.3.2 #设置缺省路由 [Huawei]q #返回上一层 <Huawe…...

solr 远程命令执行 (CVE-2019-17558)

漏洞描述 Apache Velocity是一个基于Java的模板引擎&#xff0c;它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目&#xff0c;旨在确保Web应用程序在表示层和业务逻辑层之间的隔离&#xff08;即MVC设计模式&#xff09;。 Apa…...

STM32端口模拟编码器输入

文章目录 前言一、正交编码器是什么&#xff1f;二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…...

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han...

MYSQL- 查看存储过程调式信息语句(二十七)

13.7.5.27 SHOW PROCEDURE CODE 语句 SHOW PROCEDURE CODE proc_name此语句是MySQL扩展&#xff0c;仅适用于已构建有调试支持的服务器。它显示了命名存储过程的内部实现的表示。类似的语句SHOW FUNCTION CODE显示有关存储函数的信息&#xff08;见第13.7.5.19节“SHOW FUNTIO…...

C#基础上机练习题

21.计算500-800区间内素数的个数cn&#xff0c;并按所求素数的值从大到小的顺序排列&#xff0c;再计算其间隔加、减之和&#xff0c;即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求&#xff0c;把结果cn和sum输出。 22.在三位整数…...

5.5 W5500 TCP服务端与客户端

文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端&#xff1a; 创建套接字[socket]&#xff1a;服务器首先创建一个套接字&#xff0c;这是网络通信的端点。绑定套接字[bind]&#xff1a;服务器将…...

一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测

一区北方苍鹰算法优化创新改进Transformer&#xff01;NGO-Transformer-LSTM多变量回归预测 目录 一区北方苍鹰算法优化创新改进Transformer&#xff01;NGO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab NGO-Transformer-LST…...

深入理解 MyBatis 的缓存机制:一级缓存与二级缓存

MyBatis 是目前 Java 开发中常用的一种 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它不仅简化了 SQL 语句的编写和管理&#xff0c;还提供了强大的缓存机制&#xff0c;用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存&#xff0c;分别应用于不…...

OpenAPI状态机建模指南:用有限状态机设计RESTful API的终极方法 [特殊字符]

OpenAPI状态机建模指南&#xff1a;用有限状态机设计RESTful API的终极方法 &#x1f680; 【免费下载链接】OpenAPI-Specification The OpenAPI Specification Repository 项目地址: https://gitcode.com/gh_mirrors/op/OpenAPI-Specification OpenAPI Specification 是…...

手把手教你玩转双闭环MMC逆变仿真

双闭环&#xff0b;最近电平逼近调制MMC模块化多电平换流器仿真&#xff08;逆变侧&#xff09;含技术文档 MMC Matlab-Simulink 直流侧11kV 交流侧6.6kV N22 采用最近电平逼近调制NLM 环流抑制&#xff08;PIR比例积分准谐振控制&#xff09;&#xff0c;测量桥臂电感THD获得抑…...

错误处理与HTTP状态码:Zalando RESTful API Guidelines 的异常管理机制

错误处理与HTTP状态码&#xff1a;Zalando RESTful API Guidelines 的异常管理机制 【免费下载链接】restful-api-guidelines A model set of guidelines for RESTful APIs and Events, created by Zalando 项目地址: https://gitcode.com/gh_mirrors/re/restful-api-guideli…...

路沿模板,乐山水泥路面模板,40公分路面钢模哪里有名

打路面模板&#xff1a;乐山水泥路面的优质之选在道路建设中&#xff0c;打路面模板起着至关重要的作用。它不仅关系到路面的成型质量&#xff0c;还影响着整个工程的效率和成本。乐山地区对于道路建设的需求不断增加&#xff0c;尤其是在水泥路面的铺设方面&#xff0c;40公分…...

VoxCPM-1.5-WEBUI问题解决:部署常见错误与一键启动脚本详解

VoxCPM-1.5-WEBUI问题解决&#xff1a;部署常见错误与一键启动脚本详解 1. 快速入门指南 1.1 镜像部署准备 在开始使用VoxCPM-1.5-WEBUI之前&#xff0c;您需要确保具备以下条件&#xff1a; 支持CUDA的NVIDIA显卡&#xff08;建议RTX 3060及以上&#xff09;至少16GB系统内…...

好写作AI:利用多轮人机交互迭代实现深度降AIGC的方法论

改一遍不够&#xff1f;那就改三遍——但每遍都要改对地方很多同学用AI辅助写论文&#xff0c;流程是这样的&#xff1a;用AI生成一段文字 → 觉得“AI味儿”有点重 → 手动改几个词 → 提交。然后被检测系统打回来。于是困惑&#xff1a;我都改了&#xff0c;怎么还是不行&…...

实战演练:在快马平台用codex生成一个完整的react用户管理组件

今天想和大家分享一个实战案例&#xff1a;如何在InsCode(快马)平台用Codex快速生成一个React用户管理组件。整个过程比我预想的顺畅很多&#xff0c;特别适合需要快速原型开发的场景。 项目需求拆解 用户管理是后台系统的标配功能&#xff0c;这次要实现三个核心模块&#xff…...

从静态到动态:开源AI视频生成工具如何用3分钟改变你的创作方式

从静态到动态&#xff1a;开源AI视频生成工具如何用3分钟改变你的创作方式 【免费下载链接】stepvideo-ti2v 项目地址: https://ai.gitcode.com/StepFun/stepvideo-ti2v 在AI技术日新月异的今天&#xff0c;视频创作正经历着一场前所未有的革命。阶跃星辰推出的Step-Vi…...

TVBoxOSC:电视盒子全能播放解决方案终极指南

TVBoxOSC&#xff1a;电视盒子全能播放解决方案终极指南 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库&#xff0c;用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC 你是否曾经为电视盒子播放视频时遇到格式…...

XposedRimetHelper:如何优雅解决远程办公的定位打卡难题?[特殊字符]

XposedRimetHelper&#xff1a;如何优雅解决远程办公的定位打卡难题&#xff1f;&#x1f680; 【免费下载链接】XposedRimetHelper Xposed 钉钉辅助模块&#xff0c;暂时实现模拟位置。 项目地址: https://gitcode.com/gh_mirrors/xp/XposedRimetHelper 面对企业日益严…...