首页 > 编程语言 >C# 12 新增功能实操!

C# 12 新增功能实操!

时间:2024-07-24 22:19:14浏览次数:12  
标签:12 .. 示例 C# 创建 int 实操 数组 public

前言

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

注意:使用这些功能需要使用最新的 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}");
        }
    }
}

参考文章

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

标签:12,..,示例,C#,创建,int,实操,数组,public
From: https://www.cnblogs.com/Can-daydayup/p/18321876

相关文章

  • 【C#】-byte[]数组和string的互相转化 (四种方法)
    第一种stringstr=System.Text.Encoding.UTF8.GetString(bytes);byte[]decBytes=System.Text.Encoding.UTF8.GetBytes(str);同样的,System.Text.Encoding.Default,System.Text.Encoding.ASCII也是可以的。还可以使用System.Text.Encoding.UTF8.GetString(bytes).TrimEnd('\0......
  • [POI]主管:你尽快封装一套读、写excel的方法,尽量简单
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18321864出自【进步*于辰的博客】方法简单,也出于个人时间考虑,就未作过多注释和说明,可谓,本文只有代码,但相信你一看便懂。目录1、读2、写最后1、读1、文件兼容类型。//......
  • c#写一个WINFORM的多线程操作
    以下是一个简单的示例,展示了如何在C#WinForms中创建一个按钮的异步事件,并使用Label控件来显示事件执行的时长。首先,确保你已经在你的项目中添加了一个Button和一个Label控件。假设按钮的名称是btnAsync,标签的名称是lblDuration。然后,在你的Form类中,添加以下代码:csh......
  • YC322A [ 20240724 CQYC NOIP 模拟赛 T4 ] 庫的 序计数(counting)
    题意给定一棵树\(T\),每次操作在某个点下方接上\(k\)个儿子。询问期望多少次排列,使得\(a_{fa_i}<a_i\)。保证\(k\)是偶数,对\(65536\)取模。\(n\le10^5,k\le2\times10^9\)。Sol考虑假如已经确定了一棵树的形态,如何求出最终的答案?可以发现对于每一个节点......
  • POJ3278 Catch That Cow
    CatchThatCowTimeLimit: 2000MS MemoryLimit: 65536KTotalSubmissions: 222142 Accepted: 67092DescriptionFarmerJohnhasbeeninformedofthelocationofafugitivecowandwantstocatchherimmediately.Hestartsatapoint N (0......
  • locust多进程实现分布式压测遇到的问题
    多进程分布式的实现:locust分布式时,需借助命令locust一个一个启动worker,在使用中有点繁琐,下面借助于多进程,按既定worker数量,一键启动;fromlocustimportFastHttpUser,task,User,events,HttpUser#classWebsiteUser(FastHttpUser):错误的使用!!!classWebsiteUser(......
  • Codeforces Round 961 (Div. 2)
    A.Diagonals----------------------------题解----------------------------------注意读题,题目中只有i+j相同的格子才是一个对角线,也就是说,(1,1)(2,2)(3,3)的那条大斜线不是个对角线,如图所示这是一个3*3的图中所有的对角线,那么我们只需要如图所示,从中间往两边依次放就可以,......
  • 关于珞石机器人二次开发SDK的posture函数的算法RX RY RZ纠正 C#
    在珞石SDK二次开发的函数钟,获取当前机器人位姿的函数posture函数在输出时会发现数据不正确,与示教器数据不一致。其中第一个数据正确第二三各数据为相反第四五六各数据为弧度制转换方法为(弧度/PI)*180度然后发现第四个数据还要加上180度第五六各数据要取反,,所以设计了以下......
  • cannot reclaim 52428800 bytes disk space from 4070572032 limit
    RMAN>backupdatabase;Startingbackupat24-JUL-24usingchannelORA_DISK_1channelORA_DISK_1:startingfulldatafilebackupsetchannelORA_DISK_1:specifyingdatafile(s)inbackupsetinputdatafilefilenumber=00001name=/u01/app/oracle/oradata/orcl/s......
  • 1330、基于51单片机蓝牙远程消防灭火小车 寻火源避障灭火小车(程序+原理图+PCB源文件+
    毕设帮助、开题指导、技术解答(有偿)见文未  目录方案选择单片机的选择显示器选择方案一、设计功能二、实物图单片机模块设计三、原理图四、程序源码五、PCB图资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方......