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

C# 13 中的新增功能

  1. C# 12 中的新增功能
  2. C# 11 中的新增功能
  3. C# 10 中的新增功能
  4. C# 9.0 中的新增功能
  5. C# 8.0 中的新增功能
  6. C#7.0中有哪些新特性?
  7. C#6.0中10大新特性的应用和总结
  8. C# 5.0五大新特性

将C#语言版本升级为预览版

C# 13 包括一些新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 预览版 SDK 尝试这些功能。若想在.NET项目中尝试使用C#的最新预览版特性,可以按照以下步骤来升级你的项目语言版本

.打开项目文件:
找到并打开您的.csproj 项目文件。

定位到<PropertyGroup>标签:
在项目文件中,找到<PropertyGroup>这一标签。它包含了项目的多项配置设置。

设置<LangVersion>
<PropertyGroup>标签内,找到或添加<LangVersion>这一行。将其值设置为 preview,意味着你希望使用C#的最新预览版特性。

<LangVersion>preview</LangVersion>

保存并关闭项目文件:
完成上述设置后,请保存并关闭您的.csproj项目文件。

重新编译项目:
打开你的开发环境(例如Visual Studio),并重新编译项目。此时,你应该能够使用C#的最新预览版特性了。

验证设置:
为确保设置生效,你可以编写一些利用C#最新特性的代码,并尝试编译运行。如果一切正常,那么你的项目已经成功升级为使用C#预览版了。

以下是一个示例的 .csproj 项目文件,它已经完成了上述所有设置:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><LangVersion>preview</LangVersion></PropertyGroup></Project>

在这个示例中,<OutputType>设置为Exe,表示这是一个生成可执行文件的项目;<TargetFramework>设置为net9.0,表示项目基于.NET 9.0框架;<ImplicitUsings><Nullable>分别启用隐式using指令和可为空的引用类型特性;而<LangVersion>则设置为preview,以便使用C#的最新预览版特性。

遵循上述步骤,你就可以轻松地将你的.NET项目升级为使用C#的最新预览版了。

C# 13 包括以下新增功能。

  • 新的转义序列 - \e
  • 方法组自然类型改进
  • 对象初始值设定项中的隐式索引器访问

1. 新的转义序列 - \e

在C#中,ESCAPE字符是一个特定的控制字符,其Unicode编码为U+001B。在 ASCII 码表中,它对应的十进制值是 27。ESCAPE字符通常用于控制设备或程序执行特定的操作,比如在串行通信中,它可以用来指示一个命令或数据的结束。

在C#中,字符文本转义序列允许你在代码中表示那些难以直接在代码中使用的字符,比如换行符(\n)、回车符(\r)或者是引号(\")。在C#的早期版本中,如果你需要在代码中表示ESCAPE字符,你通常会使用 \u001b(Unicode转义序列)或 \x1b(十六进制转义序列1)。然而,\x1b的使用可能会导致一些问题,因为如果1b后面的字符是一个有效的十六进制数字,编译器可能会错误地将它们一起解释为一个转义序列。

例如,如果你尝试使用\x1b1来表示一些文本,编译器可能会将其解释为一个逻辑错误或不符合预期的行为,因为它试图将\x1b1解释为一个单一的转义字符,而不是你想要的ESCAPE字符后跟一个1。

为了解决这个问题,C# 13引入了一个新的转义序列:\e,它专门用于表示ESCAPE字符(U+001B)。这样,你就可以在代码中更安全、更清晰地使用ESCAPE字符了,而不用担心后面字符的影响。

以下是一个使用 \e 转义序列的示例:

// 使用新的转义序列表示ESCAPE字符
char escapeChar = '\e';// 输出ESCAPE字符的Unicode编码
Console.WriteLine($"The Unicode code point of the ESCAPE character is {Convert.ToInt32(escapeChar):X4}");
// 输出:The Unicode code point of the ESCAPE character is 001B

在这个示例中,我们创建了一个名为 escapeChar 的字符变量,并使用\e转义序列将其初始化为ESCAPE字符。然后,我们使用Convert.ToInt322方法将escapeChar转换为它的Unicode编码,并使用X4格式说明符将其格式化为四位十六进制数。最后,我们使用Console.WriteLine方法输出ESCAPE字符的Unicode编码。

现在,有了\e这个新的转义序列,你就可以更安全、更清晰地表示ESCAPE字符了,而不用担心后面字符的影响。
 

// 使用新的转义序列表示ESCAPE字符
char escapeChar = '\e';

这样,代码的可读性和安全性都得到了提升。

2.方法组自然类型改进

在C# 13中,针对方法组的重载解析进行了一项重要的优化。这项优化显著改进了编译器在处理方法组时的效率和准确性,特别是在涉及大量候选方法的复杂场景中。下面我们将深入解释这一优化,包括其背景、新行为、以及如何在实际编程中应用这些变更。

在C#的早期版本中,当编译器遇到涉及方法组的表达式时,它会构造一个完整的候选方法集。如果需要从这些候选方法中确定一个“自然类型”(Natural Type),则整个过程依赖于整个候选方法集。这种方法在处理包含大量候选方法的复杂场景时,可能会变得低效,因为编译器需要遍历所有候选方法才能找到匹配的方法。

从C# 13开始,编译器在处理方法组时采用了更高效的策略。新行为的核心是在每个作用域内逐步削减候选方法集,移除那些明显不适用的候选方法。这一过程更紧密地遵循了C#的重载决策算法,从而提高了编译时的效率和准确性。

具体来说,编译器会按照以下步骤处理方法组:

确定候选方法集:编译器首先根据方法组的上下文确定初始候选方法集。这个集合包含了所有可能适用的方法,包括实例方法、静态方法、扩展方法等。

作用域内削减:编译器从内层作用域开始,逐一检查每个候选方法。如果方法不满足当前上下文的约束(如参数数量不匹配、类型不匹配、访问级别不足等),则将其从候选方法集中移除。这一步骤会显著减少候选方法集的大小,使得后续的重载决策更加高效。

逐层搜索:如果在当前作用域内没有找到匹配的候选方法,编译器将移动到外层作用域,并重复上述削减过程。这个过程会一直持续到找到匹配的候选方法或确定没有适用的方法。

确定自然类型:如果编译器在任何一个作用域内找到了至少一个匹配的候选方法,它将根据重载决策算法从这些候选方法中选择一个“最佳”方法。这个“最佳”方法将成为方法组的自然类型,并用于后续的代码生成和类型检查。

. 错误处理:如果编译器在所有作用域内都没有找到匹配的候选方法,它将报告一个编译时错误,指出方法组没有自然类型。这通常意味着代码中存在类型不匹配或方法签名不正确的问题。

示例代码
以下是一个具体的示例,展示了C# 13中方法组自然类型优化的应用:

public class MyClass
{public void MyMethod(int x) { }public void MyMethod<T>(T x) where T : class { }public void MyMethod(string x) { }
}public class Program
{static void Main(){MyClass obj = new MyClass();Action<MyClass, int> action = (MyClass m, int x) => m.MyMethod(x); // 使用 MyMethod(int)}
}

在这个例子中,编译器会针对方法组 m.MyMethod(x) 构造候选方法集。首先,它会考虑 MyClass 类中所有名为 MyMethod 的方法。然后,它会根据上下文(即 Action<MyClass, int> 委托的类型)削减候选方法集。具体来说,它会移除那些参数数量不匹配或参数类型不匹配的方法。在这个例子中,MyMethod<T>(T x)MyMethod(string x) 都会被移除,因为它们的参数类型与 Action<MyClass, int> 委托的参数类型不匹配。最终,编译器会选择 MyMethod(int x) 作为自然类型,并将其用于后续的代码生成和类型检查。

C# 13对方法组自然类型的优化显著提高了编译器的效率和准确性,使得在复杂场景下的重载解析更加可靠。通过理解这一新行为,开发者可以更有效地编写和利用方法重载,提高代码的可读性和可维护性。同时,这也使得编译器在处理大型项目和复杂代码库时更加高效和稳定。

3.对象初始值设定项中的隐式索引器访问

C# 13 中引入的隐式“从末尾开始”索引运算符 ^ 为数组和集合的初始化带来了显著的变化和便利。在详细探讨这一特性之前,我们先回顾一下在 C# 13 之前版本中初始化数组或集合的常见做法。

在 C# 13 之前的版本中,如果你需要在对象初始值设定项中初始化一个数组或集合,你必须显式地为每个元素指定索引,并且这些索引必须从 0 开始,逐个递增。例如:
 

public class S
{public int[] buffer;
}var v = new S()
{buffer = new int[]{[0] = 0,[1] = 1,[2] = 2,// ... 以此类推,直到你填满整个数组}
};

这种方式有几个明显的缺点:

  1. 你需要知道数组或集合的确切长度,以便从 0 开始为每个元素指定索引。
  2. 当数组或集合很大时,逐个指定索引可能会变得非常繁琐。
  3. 如果你需要从数组的末尾开始填充数据,这种方式尤其不便。

现在,让我们来看看 C# 13 中的新特性如何解决这些问题。

在 C# 13 中,你可以使用隐式“从末尾开始”的索引运算符 ^ 在对象初始值设定项中初始化数组或集合。这个运算符允许你从数组的末尾开始指定索引,而不需要知道数组的实际长度。例如:

public class S
{public int[] buffer;
}var v = new S()
{buffer ={[^1] = 9,  // 数组的最后一个元素[^2] = 8,  // 数组倒数第二个元素[^3] = 7,  // 以此类推...[^4] = 6,[^5] = 5,[^6] = 4,[^7] = 3,[^8] = 2,[^9] = 1,[^10] = 0 // 数组的第一个元素}
};

在这个示例中,我们使用了 ^ 运算符来从数组的末尾开始为元素指定值。这种方式有几个优点:

  1. 你不需要知道数组的实际长度。只需指定你想要初始化的元素数量即可。
  2. 当数组很大时,这种方式更加简洁和方便。
  3. 它特别适用于需要从数组末尾开始填充数据的场景。

总的来说,C# 13 中引入的隐式“从末尾开始”索引运算符 ^ 极大地提高了在对象初始值设定项中初始化数组或集合的灵活性和便利性。这一特性在处理大型数组或需要从数组末尾开始填充数据的场景时尤其有用。它简化了代码,提高了可读性,并减少了出错的可能性。

1. 在C#中,十六进制数是一种常用的数值表示方式,特别是在处理位操作、颜色值、内存地址等场景时。十六进制数使用基数为16的数学系统,它使用0-9来表示值0到9,以及使用’A’-‘F’(或小写的’a’-‘f’)来表示值10到15。


在C#中,你可以通过在数字前面加上0x前缀来表示一个十六进制数。

例如:
int hexValue = 0x1A3F;
在这个例子中,hexValue是一个整型变量,其值为十六进制数1A3F,它等于十进制的6703。
十六进制数在处理颜色值时特别有用,因为颜色通常使用RGB(红、绿、蓝)模型来表示,每个颜色通道的值范围是0-255,正好可以用两位十六进制数来表示。例如,十六进制数0x00FF00表示绿色,其中红色和蓝色通道的值都是0,绿色通道的值是255。 ↩︎

2. 在C#中,你还可以使用Convert.ToInt32方法将字符串形式的十六进制数转换为整数,或者使用ToString方法将整数转换为十六进制字符串表示。

例如:
int intValue = Convert.ToInt32(“1A3F”, 16);
string hexString = intValue.ToString(“X”);
在这个例子中,intValue变量会被设置为十进制数6719,它是十六进制数1A3F的十进制表示。然后,intValue被转换为十六进制字符串"1A3F"并存储在hexString变量中。注意,ToString方法中的"X"格式说明符用于指示将数字转换为十六进制字符串表示(X的大小写指出1A3F中字母的大小写)。 ↩︎

  1. C# 12 中的新增功能
  2. C# 11 中的新增功能
  3. C# 10 中的新增功能
  4. C# 9.0 中的新增功能
  5. C# 8.0 中的新增功能
  6. C#7.0中有哪些新特性?
  7. C#6.0中10大新特性的应用和总结
  8. C# 5.0五大新特性

相关文章:

C# 13 中的新增功能

C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C&#xff03;7.0中有哪些新特性&#xff1f;C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...

视频自学笔记

一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像&#xff0c;以前所接触的电影、电视都是模拟信号&#xff0c;之所以将它们称为模拟信号&#xff0c;是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…...

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…...

02-开发环境搭建

02-开发环境搭建 鸿蒙开发环境的准备主要分为以下环节&#xff1a; 注册开发者实名认证创建应用下载安装开发工具新建工程 注册开发者 在华为开发者联盟网站上&#xff0c;注册成为开发者&#xff0c;并完成实名认证。 打开华为开发者联盟官网&#xff0c;点击“注册”进入…...

DBeaver导入csv到数据库

DBeaver的图标是一只小浣熊&#xff0c;查了下Beaver确实是浣熊的意思&#xff0c;看起来还是蛮可爱的。 业务上有需要导入csv到数据库的需求&#xff0c;试用了下&#xff0c;发现挺好用的。有很多属性可以定制。 导入步骤&#xff1a; 1.建表&#xff0c;表字段与待导入cs…...

React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)

组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 什么情况下使用发布订阅模式 a、当我们想要兄弟组件之间通讯&#xff0c;而共同的父组件中又用不到这些数据时候&#xff1b; b、当多个毫无相关的组件之间想要进行数据…...

tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包

tcpdump 是一个网络数据包分析工具&#xff0c;通过捕获并显示网络接口上传输的数据包&#xff0c;帮助用户分析网络流量。 原理&#xff1a;用户态通过 libpcap 库控制数据包捕获&#xff0c;内核态通过网卡驱动获取数据包。 核心功能包括&#xff1a;捕获、过滤和分析数据包…...

ASPICE评估体系概览:对象、范围与参考标准解析

ASPICE&#xff08;汽车软件过程改进和能力确定&#xff09;是一个框架&#xff0c;它被广泛应用于汽车行业的软件开发和维护过程的改进。 它类似于软件工程领域的CMMI&#xff08;能力成熟度模型集成&#xff09;&#xff0c;但专门针对汽车行业&#xff0c;考虑了该行业特有…...

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …...

Java设计模式之适配器模式:深入JDK源码探秘Set类

在Java编程中&#xff0c;Set类作为一个不允许存储重复元素的集合&#xff0c;广泛应用于数据去重、集合运算等场景。然而&#xff0c;你是否曾好奇Set类是如何在底层实现元素唯一性判断的&#xff1f;这背后隐藏的力量正是适配器模式。 适配器模式简介 适配器模式&#xff0…...

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…...

【WebRTC】Android SDK使用教学

文章目录 前言PeerConnectionFactoryPeerConnection 前言 最近在学习WebRTC的时候&#xff0c;发现只有JavaScript的API文档&#xff0c;找了很久没有找到Android相关的API文档&#xff0c;所以通过此片文章记录下在Android应用层如何使用WebRTC 本篇文章结合&#xff1a;【W…...

基于单片机的智能晾衣控制系统的设计与实现

摘要:本文是以 AT89C52 单片机为核心来实现智能晾衣控制系统。在这个系统中,雨水检测传感器是用来检测出雨的,而控制器将检测信号的变换,根据变换后的信号自动驱动直流电机将被风干 的棒收回,以便随时控制直流电机来实现晾衣;在光敏模块中检测昼夜的环境,自动控制晾衣杆…...

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…...

三、使用 Maven:命令行环境

文章目录 1. 第一节 实验一&#xff1a;根据坐标创建 Maven 工程1.1 Maven 核心概念&#xff1a;坐标1.2 实验操作1.3 Maven核心概念&#xff1a;POM1.4 Maven核心概念&#xff1a;约定的目录结构 2. 实验二&#xff1a;在 Maven 工程中编写代码2.1 主体程序2.2 测试程序 3. 执…...

Blender导入下载好的fbx模型像的骨骼像针戳/像刺猬

为什么我下载下来的骨骼模型和我自己绑定的模型骨骼朝向完全不一样 左边是下载的模型 右边是我自己绑定的模型 左边的模型刚刚感觉都是像针一样往外戳的&#xff0c;像刺猬一样那种。 解决方法勾选自动骨骼坐标系...

如何高效搭建智能BI数据分析系统

作为当今信息化时代&#xff0c;数据资产已经成为企业最为核心倚重的&#xff0c;自然企业也就面临来自于对内部这些数据的处理和分析。如何在大批量的数据当中提取有用信息&#xff0c;帮助企业做出智慧决策&#xff0c;是不少企业面临的问题。作为国内知名的BI数据分析系统服…...

第 6 章 Java 并发包中锁原理剖析Part one

目录 6.1 LockSupport 工具类 6.2 独占锁 ReentrantLock 的原理 获取锁 1&#xff0e;void lock() 方法 2&#xff0e;void lockInterruptibly() 方法 3&#xff0e;boolean tryLock() 方法 4&#xff0e;boolean tryLock(long timeout, TimeUnit unit) 方法 释放锁 6.1 Lo…...

使用 Canvas 绘制一个镂空的圆形区域

如果要实现一个类似人脸识别的界面&#xff0c;要求使用 canvas 进行绘制&#xff0c;中间镂空透明区域&#xff0c;背景是白色的画布。 技术方案&#xff1a; 首先&#xff0c;使用 canvas 绘制一个白色画布其次&#xff0c;使用 context.globalCompositeOperation 合成属性进…...

【Notepad++】---设置背景为护眼色(豆沙绿)最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Notepad】---设置背景为护眼色&#xf…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...