C# 12 新增功能实操!

前言

今天咱们一起来探索并实践 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", "追逐时光者"];// 创建一个 SpanSpan<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.mzph.cn/bicheng/51911.shtml

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

相关文章

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

Pytorch笔记1

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 整体框架如下 目录 gpu加速数据数据结构张量TensorVariable 预处理数据增强 模型构建模块组织复杂网络初始化网络参数定义网络层 损失函数创建损失函数设置损失函数超参数选择损失函数 优化器管理模型参数管理…

“八股文”:程序员的福音还是梦魇?

——一场关于面试题的“代码战争” 在程序员的世界里&#xff0c;“八股文”这个词儿可谓是“如雷贯耳”。不&#xff0c;咱们可不是说古代科举考试中的那种八股文&#xff0c;而是指程序员面试中的那些固定套路的题目。如今&#xff0c;各大中小企业在招聘程序员时&#xff0…

无为自然与机巧器械

无为自然与机巧器械 一天&#xff0c;庄周与蔺且正在整理这些天来为求道之人回答的谈话录&#xff0c;又来了一位士。这位士提了这样一个问题&#xff1a;   “庄周先生&#xff0c;您的学说以无为自然为主&#xff0c;那么&#xff0c;您是不是主张将一切人所创造出来的机巧…

vite解决前端跨域步骤

Vite 解决跨域问题的原理主要是通过其内置的开发服务器功能实现的&#xff0c;具体来说&#xff0c;是通过 HTTP 代理&#xff08;HTTP Proxy&#xff09;机制。在开发环境中&#xff0c;Vite 服务器可以配置为一个代理服务器&#xff0c;将前端应用发出的请求转发到实际的后端…

Overlay网络

Overlay 介绍 Overlay网络是将已有的物理网络&#xff08;Underlay网络&#xff09;作为基础&#xff0c;在其上建立叠加的逻辑网络&#xff0c;实现网络资源的虚拟化。 传统网络带来了以下一些问题&#xff1a; ● 虚拟机规模受 网络规格限制在传统二层网络环境下&#xff0…

ConcurrentHashMap 和 Hashtable的区别

ConcurrentHashMap 和 Hashtable 的区别&#xff1a; 1. 线程安全机制&#xff1a; - ConcurrentHashMap 采用分段锁&#xff08;Segment&#xff09;的机制实现线程安全。它将数据分成多个段&#xff08;Segment&#xff09;&#xff0c;每个段都有一个独立的锁。这样&#xf…

暑期计划总结

每日安排 早上用来学习新知识 中午用于巩固 晚上再尝试难一点的 注意背单词&#xff0c;题目老是看不明白 重心放在图论 目标 cf立志上1600

泰迪智能科技大数据实验室——陕西省高校合作成功案例

近年来&#xff0c;陕西省紧跟国家大数据发展战略&#xff0c;积极推进大数据产业发展。在政策扶持、产业布局、技术创新等方面取得显著成效。泰迪智能科技大数据实验室立足陕西&#xff0c;携手西安邮电大学、西安财经大学、陕西科技大学镐京学院、宝鸡文理学院、渭南师范学院…

使用Selenium爬虫批量下载AlphaFold数据库中的PDB文件

注意&#xff1a;本方法使用了python&#xff0c;下载速度一般&#xff0c;如果需要更快的大批量下载可以考虑使用其他方法&#xff0c;例如FTP Alphafold数据库其实提供了许多物种的蛋白质组&#xff1a; AlphaFold Protein Structure Database 但是如果你搜索的物种不在这个…

【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 前言 上节课完成了里程计数据与坐标变换发布&#xff0c;但是还没有测试&#xff0c;本节进行测试&#xff0c;测试之前需要知道一件事&#xff0c;上位机也就是开发板一般不做可视化用&#xff0c;因…

python包dateutil

python-dateutil 是一个 Python 第三方库&#xff0c;它提供了一系列强大的扩展来解析、操作、验证和格式化日期和时间。这个库是对 Python 标准库中 datetime 模块的补充&#xff0c;提供了许多实用的功能&#xff0c;比如解析各种格式的日期时间字符串、处理时区、计算相对日…

Python 教程(七):match...case 模式匹配

目录 专栏列表前言基本语法match 语句case 语句 模式匹配的类型示例具体值匹配类型匹配序列匹配星号表达式命名变量复杂匹配 模式匹配的优势总结 专栏列表 Python教程&#xff08;一&#xff09;&#xff1a;环境搭建及PyCharm安装Python 教程&#xff08;二&#xff09;&…

网络边界安全强化:实战技巧与策略部署

引言 网络边界安全是企业网络安全防护的第一道屏障&#xff0c;其重要性不言而喻。随着网络攻击手段的日益多样化和复杂化&#xff0c;如何有效强化网络边界安全&#xff0c;成为业界关注的焦点。本文将深入探讨网络边界安全强化的实战技巧与策略部署&#xff0c;为企业提供一…

NASA:水瓶座官方发布的第 3 级辅助雷诺兹海面温度标准映射图像降序年度数据 V3.0

Aquarius Official Release Level 3 Ancillary Reynolds Sea Surface Temperature Standard Mapped Image Descending Annual Data V5.0 水瓶座官方发布的第 3 级辅助雷诺兹海面温度标准映射图像降序年度数据 V5.0 (AQUARIUS_L3_ANCILLARY_SST_SMID_ANNUAL_V5) 简介 水瓶座 3…

[PM]面试题-产品问题

产品是做什么的? 根据自己产品的情况回答 有什么样的竞品?差异化在哪里? 根据自己产品的情况回答 产品迭代周期是多久? 大版本的更新可能要1-2个月 功能优化或者问题修复随时迭代, 1-2天或者3-5天都有可能 产品是怎么盈利的?商业模式是什么? 根据自己产品的情况回…

关于swift- OC混编使用Pod遇到的2个错误

错误1 Cannot find interface declaration for UITableViewCell, superclass of "DEFUITalbleViewCell" Cannot find interface declaration for UIView, superclass of "DefUIView" Cannot find interface declaration for 系统类, superclass of "自…

jQuery 遍历

jQuery 遍历 引言 jQuery 是一个广泛使用的 JavaScript 库,它简化了 HTML 文档的遍历、事件处理、动画和 AJAX 交互。在本文中,我们将深入探讨 jQuery 的遍历功能,这是 jQuery 核心的一部分,允许开发者轻松地选择和操作 DOM 元素。 目录 jQuery 遍历简介选择器 基本选择…

vue3 解决数据最初始为空,页面出现空白或者默认值

1. 问题描述 存在一个数组 tabsBars&#xff0c;当我们判断其为空时&#xff0c;显示默认文本&#xff0c;当其异步获取数据后&#xff0c;显示正常内容。 const tabsBars ref([]);const getInfo async () > {const res await getListApi();tabsBars.value res.tabsLi…

关于vue-router的钩子函数(vue知识点/面试题)

Vue 2 中&#xff0c;Vue Router 提供了多个钩子函数&#xff08;导航守卫&#xff09;来控制路由的行为。这些钩子函数主要分为以下几类&#xff1a; 全局守卫&#xff08;Global Guards&#xff09; beforeEach&#xff1a;在每次路由切换前被调用。常用于验证用户身份或权…