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

《C#面向语言版本编程》C# 13 中的新增功能

将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中字母的大小写)。 ↩︎

相关文章:

《C#面向语言版本编程》C# 13 中的新增功能

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

0成本通过Hugo和GitHub Pages搭建博客

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 使用 Chocolatey 安装 Hugo Chocolatey 是一个 Windows 软件包管理器&#xff0c;使用 PowerShell 和 NuGet 作为基础。它可以自动化软件的安装、升级和卸载过…...

Ollama 可以玩 GLM4和CodeGeeX4了

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…...

浅析C++指针与引用的关系

前言&#xff1a; 在实践中指针与引用相辅相成&#xff0c;功能相互叠加&#xff0c;但各有各的特点&#xff0c;互相不可替代&#xff01;&#xff01;&#xff01;...

Python面试宝典第31题:字符串反转

题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来&#xff0c;输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组&#xff0c;并使用O(1)的额外空间解决这一问题。备注&#xff1a;s[i]都是ASCII码表中的可打印…...

【深入理解SpringCloud微服务】深入理解微服务中的远程调用,并手写一个微服务RPC框架

【深入理解SpringCloud微服务】深入理解微服务中的远程调用&#xff0c;并手写一个微服务RPC框架 远程过程调用微服务中的RPC框架如何实现一个微服务中的RPC框架接口扫描生成代理对象代理对象处理逻辑 手写一个微服务RPC框架RPCClientEnableRPCClientMicroServiceRPCClientRegi…...

数据结构----二叉树

小编会一直更新数据结构相关方面的知识&#xff0c;使用的语言是Java&#xff0c;但是其中的逻辑和思路并不影响&#xff0c;如果感兴趣可以关注合集。 希望大家看完之后可以自己去手敲实现一遍&#xff0c;同时在最后我也列出一些基本和经典的题目&#xff0c;可以尝试做一下。…...

通过python管理mysql

打开防火墙端口&#xff1a; 使用 firewall-cmd 命令在防火墙的 public 区域中永久添加 TCP 端口 7500&#xff08;FRP 控制台面板端口&#xff09;、7000&#xff08;FRP 服务端端口&#xff09;以及端口范围 6000-6100&#xff08;一组客户端端口&#xff09;。这些端口是 FR…...

Run the OnlyOffice Java Spring demo project in local

Content 1.Download the sample project in java2.Run the project3.Test the example document 1.Download the sample project in java Link: download the sample code in official website document properties setting spring 项目所在的服务器 server. Address192.168…...

11. Rancher2.X部署多案例镜像

**部署springboot项目 : ** **部署中间件Mysql8.0 : ** 名称&#xff1a;service-mysql 端口 &#xff1a;3306:3306 镜像&#xff1a;mysql:8.0 环境变量&#xff1a; MYSQL_ROOT_PASSWORDxdclass.net168路径映射 /home/data/mysql/data /var/lib/mysql:rw /etc/localtime…...

探索Linux世界之Linux环境开发工具的使用

目录 一、yum -- Linux软件包管理器 1、什么是yum 2、yum的使用 2.1 yum一些经常见的操作 1.查看软件包 2. 安装软件包 3. 删除软件包 3、yum的周边知识 3.1 yum的软件包都是从哪里来的&#xff1f;是从哪里能下载到这些软件包&#xff1f; 3.2 yum的拓展软件源 二、…...

探索Spring Boot微服务架构的最佳实践

目录 引言 一、Spring Boot简介 二、微服务架构的关键要素 三、Spring Boot在微服务中的最佳实践 3.1 清晰的服务边界 3.2 自动化配置与依赖管理 3.3 服务注册与发现 3.4 配置管理 3.5 安全与认证 3.6 监控与日志 3.7 分布式事务 四、总结 引言 在当今快速迭代的软…...

[论文泛读]zkLLM: Zero Knowledge Proofs for Large Language models

文章目录 介绍实验数据实验数据1实验数据2实验数据3 介绍 这篇文章发在CCS2024&#xff0c;CCS是密码学领域的顶会。作者是来自加拿大的University of Waterloo。文章对大语言模型像GPT和LLM等大语言模型实现了零知识可验证执行&#xff0c;但不涉及零知识可验证训练。个人觉得…...

vscode插件中的图标怎么设置

首先在ts文件目录下和package.json同级的目录下加入一张图片&#xff0c;后缀是jpg、png、jpeg都可以。 然后package.json中加入该行 重新 vsce package即可 如果出现报错 The specified icon xxx/xxx/icon.jpg wasnt found in the extension. 那就是没有放正确文件夹的位…...

Study--Oracle-08-oracle数据库的闪回技术

一、闪回恢复区(Flash Recovery Area) 1、什么是闪回恢复区 闪回恢复区是Oracle数据库中的一个特殊存储区域&#xff0c;用于集中存放备份和恢复数据库所需的所有文件&#xff0c;包括归档日志和闪回日志。这个区域可以帮助数据库在遇到介质故障时进行完全恢复。通过将备份数…...

获取客户端真实IP

出于安全考虑&#xff0c;近期在处理一个记录用户真实IP的需求。本来以为很简单&#xff0c;后来发现没有本来以为的简单。这里主要备忘下&#xff0c;如果服务器处于端口回流&#xff08;hairpin NAT&#xff09;,keepalived&#xff0c;nginx之后&#xff0c;如何取得客户端的…...

韩式告白土味情话-柯桥生活韩语学习零基础入门教学

你们韩国人别太会告白了&#xff01; 1、너 얼굴에 뭐가 조금 묻었어! 你的脸上有点5376东西&#xff01; 뭐가 조금 묻었1585757는데? 有点什么&#xff1f; 이쁨이 조금 묻었네. 有点漂亮。 2、돌잡이 때 뭐 잡았어요&#xff1f; 你抓周的时候抓了什么&#xff1f; 쌀 잡았…...

Linux安全与高级应用(一)深入探讨Linux安全与高级应用

文章目录 深入探讨Linux安全与高级应用引言目录一、Linux安全与应用概述1.1 Linux的应用现状1.2 Linux的安全需求 二、构建LAMP企业网站平台2.1 LAMP平台简介2.2 安装和配置Apache服务器2.2.1 安装Apache2.2.2 配置Apache 2.3 安装和管理MySQL数据库2.3.1 安装MySQL2.3.2 配置M…...

【nginx 第二篇章】各个环境安装 nginx

一、Windows环境安装 1、下载 Nginx 访问Nginx官网&#xff08;http://nginx.org/en/download.html&#xff09;下载稳定版本的 Nginx 压缩包&#xff0c;如 nginx-1.xx.x.zip。下载后解压到指定的目录&#xff0c;例如 D:\nginx。 2、启动 Nginx 直接双击解压目录下的 ngi…...

在Spring Boot和MyBatis-Plus项目中,常见的错误及其解决方法2.0

1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name requestMappingHandlerMapping 现象 在创建bean时发生错误&#xff0c;通常是因为存在重复的URL映射。 解决方法 检查所有控制器方法上的URL映射注解&#xff0c;确保没有重复…...

招聘信息数据清洗

文章目录 前言代码示例如下 前言 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.Spark 清洗数据的相关方法, 2.空值列怎么删除&#xff1b; 3.怎么数据切分才能达到想要的数据。 Spark清洗数据相关方法 一、将含有空值的数据删除 1.将含有空值的数据删除&a…...

机器学习——支持向量机(SVM)(1)

目录 一、认识SVM 1. 基本介绍 2. 支持向量机分类器目标 二、线性SVM分类原理&#xff08;求解损失&#xff09; 三、重要参数 1. kernel&#xff08;核函数&#xff09; 2 .C&#xff08;硬间隔与软间隔&#xff09; 四、sklearn中的支持向量机&#xff08;自查&#…...

Elastic Observability 8.15:AI 助手、OTel 和日志质量增强功能

作者&#xff1a;来自 Elastic Alex Fedotyev, Tom Grabowski, Vinay Chandrasekhar, Miguel Luna Elastic Observability 8.15 宣布了几个关键功能&#xff1a; 新的和增强的原生 OpenTelemetry 功能&#xff1a; OpenTelemetry Collector 的 Elastic 分发&#xff1a;此版本…...

Unity3D ECS架构的优缺点详解

前言 Unity3D作为一款强大的游戏开发引擎&#xff0c;近年来在性能优化和架构设计上不断进化&#xff0c;其中ECS&#xff08;Entity-Component-System&#xff09;架构的引入是其重要的里程碑之一。ECS架构通过重新定义游戏对象的组织和处理方式&#xff0c;为开发者带来了诸…...

理解Go语言中多种并发模式

Go 的同步原语使实现高效的并发程序成为可能,并且选择合适的同步原语和并发模式可以更加容易地实现并发的可能,减少错误的发生。这里谈论的并发模式是只在 Go 语言中常见的并发的“套路” ,一种可解决某一类通用场景和问题的惯用方法。 1. 并发模式概述 我们先来回顾下同步…...

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出03:文件模式:二进制文件

系列文章目录 17.4.5 文件模式 程序清单17.18 append.cpp 程序清单17.19 binary.cpp 文章目录 系列文章目录17.4.5 文件模式程序清单17.18 append.cpp程序清单17.19 binary.cpp17.4.5 文件模式1.追加文件来看一个在文件尾追加数据的程序。程序清单17.18 append.cpp2.二进制文…...

网络安全之sql靶场(11-23)

sql靶场&#xff08;11-23&#xff09; 目录 第十一关&#xff08;post注入&#xff09; 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 第二十一关 第二十二关 第二十三关 第十一关&#xff08;post注入&#xff09; 查看…...

WordPress网站被入侵,劫持收录事件分析

7.15&#xff0c;网站被入侵&#xff0c;但是直到7月17日&#xff0c;我才发现被入侵。 16日&#xff0c;17日正常更新文章&#xff0c;17日查询网站收录数据时&#xff0c;在站长资源平台【流量与关键词】查询上&#xff0c;我发现了比较奇怪的关键词。 乱码关键词排名 起初…...

原生js: 实现三个水平tab按钮, 默认第一个上面有class, 点击另外的实现class=‘cur‘的切换的效果

问: <ul><li class"cur">热门问题</li><li>订阅问题</li><li>使用问题</li></ul> 这是我的代码, 这是我的代码: // 遍历 helpInfoClass 数组helpInfoClass.forEach((item, index) > {var itemId item[0];var i…...

C#语言基础速成Day07

“知止而后有定&#xff0c;定而后能静&#xff0c;静而后能安&#xff0c;安而后能虑&#xff0c;虑而后能得。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day07 C#常见数据结构&#xff1a;1. 集合&#xff08;Collection&#xff09;1.1 **List<T>**1.2 **H…...