C# 12 新增功能实操!

news2024/9/17 7:41:54

前言

今天咱们一起来探索并实践 C# 12 引入的全新功能!

  • C#/.NET该如何自学入门?

注意:使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。

主构造函数

主构造函数允许你直接在类定义中声明构造函数参数,并自动生成相应的属性。

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

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

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

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

代码示例

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

    public class CSharp12GrammarExercise
    {
        public static void OutputPrint()
        {
            var person = new Person("追逐时光者", 30);
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }

    public class Person(string name, int age)
    {
        public string Name => name;
        public int Age => age;
    }

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

    public class CSharp12GrammarExercise
    {
        public static void OutputPrint()
        {
            // 创建 Distance 结构体实例
            Distance distance = new Distance(10, 55);
            // 访问 Magnitude 和 Direction 属性
            Console.WriteLine($"Magnitude: {distance.Magnitude},Direction: {distance.Direction}");
        }
    }

    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);
    }

集合表达式

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

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

        public static void CollectionExpressions()
        {
            // 创建一个数组
            int[] array = [55, 99, 100, 33];

            // 创建一个列表
            List<string> list = ["one", "two", "three", "five", "追逐时光者"];

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

            // 创建一个交错二维数组
            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[] totalList = [.. item0, .. item1, .. item2];
            foreach (var element in totalList)
            {
                Console.Write($"{element}, ");
            }

没有.. 会有异常:

图片

正常输出:

图片

内联数组

内联数组用于提高应用程序性能,允许在结构体中创建固定大小的数组。虽然你可能不会自己声明内联数组,但当它们通过 System.Span<T> 或 System.ReadOnlySpan<T> 从运行时 API 暴露出来时,你可以透明地使用它们。内联数组提供与不安全固定大小缓冲区类似的性能特性。

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

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

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

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

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

默认 lambda 参数

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

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

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

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

Func<int, int, bool> testForEquality = (x, y) => x == y;

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

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

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

任何类型的别名

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

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

using PointTest = (int item1, int item2);

namespace HelloDotNetGuide.CSharp语法
{
    public class CSharp12GrammarExercise
    {
        public static void OutputPrint()
        {
            //使用 using 关键字为元组类型创建别名,并进行调用:
            PointTest point = (10, 20);
            Console.WriteLine($"输出:Item1={point.Item1}, Item2={point.Item2}");
        }
    }
}

参考文章

  • 详细功能介绍请阅读微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-12

  • 文章示例源码地址:https://github.com/YSGStudyHards/DotNetGuide/blob/main/DotNetGuidePractice/HelloDotNetGuide/CSharp%E8%AF%AD%E6%B3%95/CSharp12GrammarExercise.cs

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

停车共享小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;停车场管理&#xff0c;停车预约管理&#xff0c;停车缴费管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;停车场&#xff0c;我的 开发系统&…

主图趋势交易九稳量化系统 期货指标公式大全 最准的期货指标源码 看期货涨跌最简单的方法文华财经指标公式源码

交易的动机必须来自于内心&#xff0c;一种解决问题的执着。在整个交易生涯的漫长岁月里&#xff0c;无法始终保持这种热忱。除非亲身体验&#xff0c;否则很难理解这种疯狂的热忱。这是一种高度的专注&#xff0c;其他一切好像都不存在&#xff0c;视野之内没有其他的东西。这…

【STL】之 vector 使用方法及模拟实现

前言&#xff1a; 本文主要讲在C STL库中vector容器的使用方法和底层的模拟实现~ 成员变量的定义&#xff1a; 对于vector容器&#xff0c;我们首先采用三个成员变量去进行定义&#xff0c;分别是&#xff1a; private:iterator _start; // 指向数据块的开始iterator _finish…

论文解读(10)-图神经网络

加油&#xff0c;继续看论文。 这次学图神经网络&#xff0c;这个概念经常在其他论文里出现&#xff0c;所以我想先学习一下这方面的知识。 参考&#xff1a; 【图神经网络综述】一文道尽GNN原理、框架和应用-CSDN博客 【图神经网络】10分钟掌握图神经网络及其经典模型_图神经…

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫&#xff1f;1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP&#xff1a;爬虫的得力助手2.1 代理IP的定义和工作原理2.2 为什么爬虫需要代理IP&#xff1f;2.3 代理IP如何解决爬虫的常见问题&#xff1f; 3. 代理IP的…

shapeit填充

使用shapeit软件进行填充 一&#xff0c;安装 下载地址&#xff0c; 官网里面写得很详细。 https://mathgen.stats.ox.ac.uk/genetics_software/shapeit/shapeit.html 二&#xff0c;步骤 官网里面每一个参数都很详细 1.拆分染色体 for chr in {1..24}; do plink --vcf /…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

Embeddings 赋能 - AI智能匹配,呈现精准内容

&#x1f680;前言 在当今的 AI 时代,传统的相关内容推荐和搜索功能已经显得相对简单和低效。借助 AI 技术,我们可以实现更加智能化和个性化的内容发现体验。 本文将为大家介绍如何利用 OpenAI 的 Embedding 技术,打造出智能、高效的相关内容推荐和搜索功能。 &#x1f680;…

UCOS-III 互斥锁接口详解

在实时操作系统uC/OS-III中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种用于管理对共享资源的访问的同步机制。互斥锁通过保证在任何时刻只有一个任务可以持有锁&#xff0c;从而防止资源竞争问题。同时&#xff0c;uC/OS-III还实现了递归锁定和优先级继承机制&…

七款公司常用的加密软件推荐|2024年公司办公加密软件推荐

在现代企业中&#xff0c;加密软件是保护敏感信息、防止数据泄露和确保通信安全的关键工具。加密软件能够对数据进行加密&#xff0c;使其在未经授权的情况下无法被读取或篡改&#xff0c;本文分享七款加密软件&#xff0c;它们各具特色&#xff0c;能够满足不同的安全需求。 1…

狂赚又吸金 身心灵赛道AI玩法全解析

想必很多初入AI的小白们&#xff0c;小白的不能在小白了&#xff0c;因为在他们眼中&#xff0c;确实对AI一无所知。 基于他们平时刷抖音、刷视频号的习惯&#xff0c;有的时候会发一些传统剪辑的作品&#xff0c;问AI怎么做&#xff1f;很多人认为AI所见的视频&#xff0c;AI…

GeoServer发布MongoDB中的shp数据全流程梳理

目录 前言1.shp转geojson2.shp导入MongoDB3.创建空间索引4.GeoServer安装MongoDB插件5.发布6.注意事项6.1 geojson要去掉头尾6.2 MongoDB4.4以上的mongoimport工具需要额外安装6.3 空间索引是必须项 7.总结 前言 网上搜到的GeoServer发布MongoDB中的矢量数据或shp数据的文章比较…

http协议与nginx

动态页面与静态页面的差别&#xff1a; &#xff08;1&#xff09;URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“&#xff1f;” &#xff08;2&#xff09;后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…

我国工业大模型发展中的四个反差现象

以大模型为代表的新一代人工智能技术正加速推进新型工业化的变革进程。2024年1月&#xff0c;国务院常务会议研究部署推动人工智能赋能新型工业化有关工作&#xff0c;强调以人工智能和制造业深度融合为主线&#xff0c;以智能制造为主攻方向&#xff0c;以场景应用为牵引&…

【Git从入门到精通】——知识概述及Git安装

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Google Test的使用

Google Test支持的操作系统包含下面这些&#xff1a; 1、Linux 2、Mac OS X 3、Windows 4、Cygwin 5、MinGW 6、Windows Mobile 7、Symbian一、google test的基本使用步骤 1、包含gtest/gtest.h头文件 2、使用TEST()宏定义测试case 3、在测试体中使用gooletest断言进行值检查…

Java从入门到精通(十四) ~ 多线程

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、多线程是什么&#xff1f; Java中的多线程 二、使用步骤 1.创建方式 1.1 Thread 线程 1.2 Runnable 任务 1.…

视创云展:重塑线上会议体验,六大核心引领数字空间新纪元

视创云展以其革命性的“数字活动”解决方案为核心&#xff0c;精心构建了一个超越想象的未来数字世界。通过整合六大前沿技术模块&#xff0c;它不仅为参会者打造了一个身临其境的线上会议环境&#xff0c;更让每一位参与者都能跨越物理界限&#xff0c;深刻感受会议的每一个瞬…

2024经济师考试报名『注册流程』图解!

⏰报名时间&#xff1a;8月12日—9月11日 ☑️报名注册流程 1、经济师考试报名注册网站&#xff1a;中国人事考试网. 2、点击考生登录栏目中的【新用户注册】按钮&#xff0c;进行注册。 3、进入用户注册界面&#xff0c;填写注册信息。 4、填写完毕确认无误后点击【提交】&…

CMS61850客户端

近一年都比较忙&#xff0c;很久没有更新文档了。这次抽了点时间&#xff0c;把CMS61850的客户端再补上。方便大家进一步的学习。当然61850相关的文档已经写的快吐了。不出意外&#xff0c;这应该是最后一篇关于61850的文章了。 本次提供的demo&#xff0c;可直接在windows上运…