C# 12 中新增的八大功能你都知道吗?

一、主构造函数

在 Visual Studio 2022 版本 17.6 预览版 2 中引入。

从 C# 12 开始,可以在类和结构中声明主构造函数。主构造函数参数都在类的整个主体的范围内。为了确保显式分配所有主构造函数参数,所有显式声明的构造函数都必须使用 this() 语法调用主构造函数。将主构造函数添加到 class 可防止编译器声明隐式无参数构造函数。在 struct 中,隐式无参数构造函数初始化所有字段,包括 0 位模式的主构造函数参数。

主构造函数参数的最常见用途包括:

  • 作为 base() 构造函数调用的参数。

  • 初始化成员字段或属性。

  • 引用实例成员中的构造函数参数。

代码示例

将任何参数放在类型名称后面的括号中:

public class NameParameter(string name)
{
    public string Name => name;
}

以下代码初始化从主构造函数参数计算的两个只读属性:

public readonly struct Distance(double dx, double dy)
{
    public readonly double Magnitude { get; } = Math.Sqrt(dx * dx + dy * dy);
    public readonly double Direction { get; } = Math.Atan2(dy, dx);
}

二、集合表达式

在 Visual Studio 2022 版本 17.7 预览版 5 中引入。

集合表达式引入了一种新的简洁语法,用于创建常用集合值。可以使用展开运算符(..)将其他集合内联到这些值中。

下面的示例展示了集合表达式的用法:

// Create an array
int[] array = [55, 99, 100, 33];

// Create a list
List<string> list = ["one", "two", "three", "five", "追逐时光者"];

// Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i', 'k'];

// Create a jagged 2D array
int[][] two2D = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [88, 8, 9]];

展开运算符(..)示例代码:

展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素。参数必须是集合类型。以下示例演示了展开运算符的工作原理:

int[] item0 = [88, 2, 3];
int[] item1 = [22, 5, 6];
int[] item2 = [7, 99, 9];
int[] single = [.. item0, .. item1, .. item2];
foreach (var element in single)
{
    Console.Write($"{element}, ");
}

没有.. 会有异常:

正常输出:

三、内联数组

在 Visual Studio 2022 版本 17.7 预览版 3 中引入。

运行时团队和其他库作者使用内联数组来提高应用程序的性能。通过内联数组,开发人员可以在结构类型中创建固定大小的数组。具有内联缓冲区的结构体应具有与不安全固定大小缓冲区类似的性能特性。

内联数组的声明与下面的结构类似:

    [System.Runtime.CompilerServices.InlineArray(20)]
    public struct Buffer
    {
        private int _element0;
    }

你可以像使用其他数组一样使用它们:

        public static void Test()
        {
            var buffer = new Buffer();
            for (int i = 0; i < 20; i++)
            {
                buffer[i] = i;
            }

            foreach (var i in buffer)
            {
                Console.WriteLine(i);
            }
        }

四、Lambda 表达式中的可选参数

在 Visual Studio 2022 版本 17.5 预览版 2 中引入。

可以为 Lambda 表达式的参数定义默认值。语法和规则与将参数的默认值添加到任何方法或本地函数相同。

如果 lambda 表达式只有一个输入参数,则括号是可选的:

Func<double, double> cube = x => x * x * x;

两个或更多输入参数使用逗号加以分隔:

可以显式指定类型,如下面的示例所示:

注意:输入参数类型必须全部为显式或全部为隐式;否则,便会生成 CS0748 编译器错误!!

Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;

五、ref readonly参数

在 Visual Studio 2022 版本 17.8 预览版 2 中引入。

ref readonly修饰符表示方法希望参数是一个变量,而不是一个非变量的表达式。不是变量的表达式包括常量、方法返回值和属性。如果参数不是变量,编译器会发出警告。

六、任何类型的别名

在 Visual Studio 2022 版本 17.6 预览版 3 中引入。

可以使用 using alias 指令来别名任何类型,而不仅仅是命名类型。也就是说,你可以为元组类型、数组类型、指针类型或其他不安全类型创建语义别名。

使用 using 关键字为元组类型创建别名,并进行调用:

using PointTest = (int x, int y);

namespace Csharp12
{
    internal class Class1
    {
        public static void Test()
        {
            PointTest point = (10, 20);
            Console.WriteLine($"Point coordinates: X={point.Item1}, Y={point.Item2}");
        }

    }
}

七、Experimental属性

在 Visual Studio 2022 版本 17.7 预览版 3 中引入。

  • 可以使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 来标记类型、方法或程序集,以指示实验性特征。如果访问使用 ExperimentalAttribute 注释的方法或类型,编译器将发出警告。用 Experimental 特性标记的程序集中包含的所有类型都是实验性的。

示例代码:

namespace Csharp12
{

    [AttributeUsage(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Constructor | System.AttributeTargets.Delegate | System.AttributeTargets.Enum | System.AttributeTargets.Event | System.AttributeTargets.Field | System.AttributeTargets.Interface | System.AttributeTargets.Method | System.AttributeTargets.Module | System.AttributeTargets.Property | System.AttributeTargets.Struct)]
    public class ExperimentalAttribute : Attribute
    {
        public ExperimentalAttribute()
        {
        }
    }

    [Experimental]
    public class ExperimentalClass
    {
        public void DoSomething()
        {
            Console.WriteLine("Doing something experimental...");
        }
    }

    internal class Class1
    {
        public static void Test()
        {
            ExperimentalClass exp = new ExperimentalClass();
            exp.DoSomething();
        }
    }
}

八、拦截器

预览功能在 Visual Studio 2022 版本 17.7 预览版 3 中引入。

拦截器是一种方法,该方法可以在编译时以声明方式将对可拦截方法的调用替换为对其自身的调用。通过让拦截器声明所拦截调用的源位置,可以进行这种替换。拦截器可以向编译中(例如在源生成器中)添加新代码,从而提供更改现有代码语义的有限能力。

注意:拦截器是一项试验性功能,在 C# 12 的预览模式下提供。在将来的版本中,该功能可能会发生中断性变更或被删除。因此,不建议将其用于生产或已发布的应用程序。

要使用拦截器,用户项目必须指定 <InterceptorsPreviewNamespaces> 属性。这是允许包含拦截器的命名空间列表。

<InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

文章转载自:追逐时光者

原文链接:https://www.cnblogs.com/Can-daydayup/p/18020222

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/394975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的药品管理系统

基于SpringBoot的药品管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 药品详情 个人中心 员工界面 管理员界面 摘要 随着医疗技术的不断发展和人们健…

电子元器件基础7---集成电路

二极管三极管再往上就是四极管、五极管么?不,四极管还有但是我没用过。再往上我们需要学习各种阻容二极管和三极管的组合,也就是今天要介绍的集成电路,它的集成度从几个晶体管组合的元器件到上亿个晶体管组成的CPU,器件数量越多集成度越高同时其功能也更加复杂。 在这里我…

【Java EE初阶十四】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…

波奇学Linux:动态库加载和进程通信

进程加载的地址 逻辑地址加载到物理内存时&#xff0c;每一条指令有自己的地址。此时指令有逻辑地址和物理地址 如何执行第一条指令&#xff1f; 代码有entry入口地址&#xff0c;cpu的eip寄存器保存入口地址&#xff0c;进程获得入口地址后运行&#xff0c;同时页表建立物理…

【ArcGIS Pro二次开发】(81):玩个花活_控规指标块生成

一、要实现的效果 废话不多说&#xff0c;这次要实现的是类似控规指标块的标注&#xff1a; 这里只是示例&#xff0c;用了5个格子&#xff0c;做成9个格子也是可以的。 在实现这个效果最关键的是要用到Pro中的复合标注。 关于复合标注的用法可以搜一下帮助里的【使用复合注…

【Java EE初阶十九】网络原理(四)

4. 数据链路层 数据链路层也有很多种协议&#xff0c;其中一个比较常见常用的,就是“以太网协议”&#xff08;通过网线/光纤, 来通信所使用的协议叫做以太网协议&#xff0c;以太网是横跨数据链路层 物理层&#xff09;&#xff1b; 4.1 以太网数据帧格式 帧头 载荷(IP 数据…

全视通智慧社区居家养老解决方案如何让老人住的更舒心?

随着老龄化社会的加速发展&#xff0c;老年人的养老问题愈发受到社会关注。传统的养老方式已经无法满足现代老年人的需求&#xff0c;他们更加注重生活的品质和舒适度。为了响应《城市居家适老化改造指导手册》要求&#xff0c;全视通智慧社区&居家养老解决方案应运而生&am…

ChatGPT对软件测试的影响!

ChatGPT 是一个经过预训练的 AI 语言模型&#xff0c;可以通过聊天的方式回答问题&#xff0c;或者与人闲聊。它能处理的是文本类的信息&#xff0c;输出也只能是文字。它从我们输入的信息中获取上下文&#xff0c;结合它被训练的大模型&#xff0c;进行分析总结&#xff0c;给…

Linux系统——防火墙拓展及重点理解

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 5.白名单 6.通用匹配 7.示例 7.1添加回环网卡 7.2可以访问端口 7.3 主…

软件技术实训解决方案2024

软件技术实训解决方案 软件产业在新兴产业中占据重要地位&#xff0c;是推动数字经济发展的关键力量。面对“十四五”时期的新机遇和挑战&#xff0c;我国已经明确了加强关键数字技术创新应用的战略方向&#xff0c;并将软件和信息技术服务业的发展列为重点。这不仅是为了加快…

信息密码管理

密码管理 密码技术时保护信息安全的最有效手段,也是保护信息安全按按的最关键技术。各国政府相应出台了各种密码管理政策用于控制密码技术、监控密码市场等。目前我国密码管理相关的机构是国家密码管理局,全称国家商用密码管理办公室。 国家出台密码相关的主要政策有《商用…

利用R语言绘制相关性热图

数据示例&#xff08;归一化处理后&#xff09;&#xff1a; install.packages("corrplot") install.packages("ggplot2") install.packages("ggpubr") library(corrplot) install.packages("GGally") library(GGally) library(ggplot…

【BIOS】解锁BIOS隐藏菜单/高级选项

免责声明&#xff1a;修改BIOS存在风险&#xff0c;请谨慎操作。作者不对因操作不当而导致的任何后果负责。 一些默认的BIOS菜单选项相当有限&#xff0c;无法进行一些高级选项的修改。通过修改BIOS内容&#xff0c;我们可以解锁被隐藏的高级菜单&#xff0c;如Above 4G Decod…

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support

直接安装&#xff0c;只支持CPU。想支持GPU&#xff0c;麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件&#xff1a; gitpythoncmakeVisual Studio Community (make sure you install t…

《计算思维导论》笔记:10.5 应用关系运算进行数据库的查询

《大学计算机—计算思维导论》&#xff08;战德臣 哈尔滨工业大学&#xff09; 《10.5 应用关系运算进行数据库的查询》 一、引言 我们接着给大家介绍数据库中的关系运算&#xff1a;应用关系运算&#xff0c;进行数据库的查询。 二、利用关系运算进行查询 我们前面给大家介绍…

实例观察 c 语言中 volatile 的作用

volatile 意思是易变的。 在 c 语言中&#xff0c;如果变量被 volatile 修饰&#xff0c;就是告诉编译器这个变量随时都可能发生变化&#xff0c;那么每次读取变量的时候都会到内存中读取。 如果变量没有被 volatile 修饰&#xff0c;并且编译器发现在多次读取变量之间&#…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4

《剑指Offer》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列2. LCR 14…

CDP和Chrome

CDP和Chrome CDP和WebDriver Protocol WebDriver和 Chrome DevTools Protocol&#xff08;CDP&#xff09; 是用于自动化浏览器的两个主要协议&#xff0c;大多数的浏览器自动化工具都是基于上述其中之一来实现的。可以通过这两种形式来和浏览器交互&#xff0c;通过代码来控…

每日一题——LeetCode1460.通过翻转子数组使两个数组相等

方法一 哈希Map 用两个Map集合分别统计target和arr里出现的元素和出现的次数&#xff0c;在比较两个Map集合看是否出现的元素和次数都相同 var canBeEqual function(target, arr) {let map1 new Map();let map2 new Map();for (let item of target) {map1.set(item, (map1…

利用 pt-archiver 实现数据库归档功能

文章目录 一、前言关于Percona 二、Percona Toolkit安装 percona-toolkit&#xff1a;pt-archiver 归档命令的使用格式&#xff1a;示例&#xff1a; 三、归档步骤&#xff1a;1&#xff09;、创建归档数据库和归档表方式一(推荐)&#xff1a;这种方式的优缺点&#xff1a; 方式…