盘点C# 9.0中好用的特性

顶级语句

将类和类里面Main函数省略,只留下核心的逻辑代码就是顶级语句!

1.顶级语句1

await System.Threading.Tasks.Task.Delay(1000);
System.Console.WriteLine("Hi!");
return 0;
static class $Program
{
    static async Task<int> $Main(string[] args)
    {
        await System.Threading.Tasks.Task.Delay(1000);
        System.Console.WriteLine("Hi!");
        return 0;
    }
}

1.顶级语句2

System.Console.WriteLine("Hi!");
return 2;
static class $Program
{
    static int $Main(string[] args)
    {
        System.Console.WriteLine("Hi!");
        return 2;
    }
}

Init

struct Point
{
    public int X { get; }
    public int Y { get; }

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}

init通过允许调用方在构造操作过程中改变成员,访问器使不可变对象更具灵活性。 这意味着对象的不可变属性可以参与对象初始值设定项,因此不再需要类型中的所有构造函数样板。 Point类型现在只是:

struct Point
{
    public int X { get; init; }
    public int Y { get; init; }
}

然后,使用者可以使用对象初始值设定项来创建对象。

var p = new Point() { X = 42, Y = 13 };

记录

记录类型是引用类型,类似于类声明。 如果不包含,记录将提供一个错误 record_base argument_list record_declaration parameter_list 。 部分记录最多只能有一个分部类型声明提供 parameter_list 。
记录参数不能 ref 使用 out 或 this 修饰符 (但 in params 允许) 。

继承

除非类为 object ,且类不能从记录继承,否则记录不能从类继承。 记录可以继承自其他记录。

 public record Student(string name,int age) {
 }
using System;
using System.Collections.Generic;

public class Student : IEquatable<Student>
    {
        #region 属性这部分 可以看到set属性没有
        #记录具有不可变性,记录一旦初始化完成,那么它的属性值将不可修改(可以通过反射修改)
        public string Name { get; init; }
        public int Age { get; init; }
        #endregion

        #region
        protected virtual Type EqualityContract => typeof(Student);
        #endregion
      
        public override bool Equals(object? obj) => Equals(obj as R1);
        public virtual bool Equals(Student? other)
        {
            return !(other is null) &&
                EqualityContract == other.EqualityContract &&
                
                EqualityComparer<string>.Default.Equals(this.Name, other.Name) &&
                EqualityComparer<int>.Default.Equals(this.Age, other.Age);
        }
        public static bool operator ==(R1? left, R1? right)
            => (object)left == right || (left?.Equals(right) ?? false);
        public static bool operator !=(R1? left, R1? right)
            => !(left == right);

         public override string ToString()
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("Student");
            builder.Append(" { ");
            if (this.PrintMembers(builder))
            {
                builder.Append(" ");
            }
            builder.Append("}");
            return builder.ToString();
        }
    }

支持解构

public record Student(string Name, int Age) {
        public string Name { get; set; }
        public int Age { get; set; }
}
Student record = new Student("张三",19) ;
var (name, age) = record;

==》这个可以用在switch匹配上 还记得我们
string value = record switch{
                ("张三", 19) => "01",
                ("李四", 25) => "02",
                _ => "default"
 };

## 之所以可以用这个这么用 是因为编译后多了这样的解构函数
 public void Deconstruct(out string Name, out int Age) => (Name, Age) = (this.Name, this.Age);

with 表达式

with表达式是使用以下语法的新表达式。

Student record2  = record with { Name = "王五" };

//在编译后等价于
var temp = record.<Clone>$();
temp.Name = "王五";
record2 = temp;

//不赋值 完全克隆
Student record3  = record with { };

好处:

1.比较两个属性是否相等跟属性设置的顺序无关
2.方便快速克隆,不影响原数据
3.补充了结构体不支持继承以及性能不高的短处

Lambda 弃元参数

允许丢弃 (用作 _ lambda 和匿名方法的参数) 。 例如:

  • lambda: (_, _) => 0 , (int _, int _) => 0
  • 匿名方法: delegate(int _, int _)
public delegate void FuncA(string a, string c);

        static void Main(string[] args)
        {

            FuncA func = (_, _) => { };

        }

原文链接:https://www.cnblogs.com/kenower/archive/2023/04/22/17343885.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:盘点C# 9.0中好用的特性 - Python技术站

(0)
上一篇 2023年4月24日
下一篇 2023年4月24日

相关文章

  • 详解从零开始—用C#制作扫雷游戏

    详解从零开始—用C#制作扫雷游戏攻略 设计概述 在开始制作扫雷游戏之前,我们先来了解一下扫雷游戏的设计概述。 扫雷游戏主要由以下几个部分组成: 游戏界面:游戏界面包括扫雷游戏的棋盘、雷区、计时器、雷数显示等。 游戏规则:扫雷游戏的规则包括鼠标操作、雷的位置随机分布以及游戏结束判断等内容。 数据存储:扫雷游戏需要实现对游戏记录的存储与读取等功能。 下面我们…

    C# 2023年6月3日
    00
  • C#实现将json转换为DataTable的方法

    将一个Json字符串转换为DataTable可以使用Json.NET库来实现。具体步骤如下: 步骤一:安装Json.NET库 在Visual Studio中打开NuGet包管理器,搜索并安装Newtonsoft.Json库。 注:也可以通过在项目的Package Manager控制台输入以下命令进行安装: Install-Package Newtonsoft…

    C# 2023年5月31日
    00
  • .Net Core 进程守护之Supervisor使用详解

    .NET Core 进程守护之Supervisor使用详解 在本攻略中,我们将详细讲解如何使用Supervisor对.NET Core进程进行守护,并提供两个示例说明。 Supervisor简介 Supervisor是一个进程守护程序,可以监控并管理多个进程。它可以在进程崩溃或异常退出时自动重启进程,保证进程的稳定性和可靠性。 安装Supervisor 在L…

    C# 2023年5月16日
    00
  • C# 系统热键注册实现代码

    下面我将为你详细讲解C# 系统热键注册实现代码的完整攻略。 1.注册全局热键 我们可以通过使用user32.dll中的RegisterHotkey函数来实现全局热键的注册。这个API函数有以下几个参数: [DllImport("user32.dll")] public static extern bool RegisterHotKey( …

    C# 2023年5月31日
    00
  • C#一个方法返回多个值示例

    下面是关于C#一个方法返回多个值的完整攻略。 什么是返回多个值的方法 C#的函数(方法)通常只能返回一个值,但是有时候一个函数需要返回多个值,此时就需要使用一些特殊的方式实现返回多个值的方法,例如使用元组(Tuple)、结构体(Struct)或者自定义类型等方式。 使用元组实现一个方法返回多个值 元组是用来组合多个数据项的一种数据结构。在C#7中,引入了元组…

    C# 2023年5月15日
    00
  • C#多线程编程中的锁系统基本用法

    接下来就为大家详细讲解C#多线程编程中的锁系统基本用法的完整攻略。 什么是锁(Lock) 锁用于多线程编程中,是一种用于避免竞争访问共享资源的同步机制。在多线程程序中,多个线程可能同时访问同一个共享资源,如果不采取任何措施,就会产生“竞态条件”,导致程序出现不可预期问题。 为了避免这种情况,我们可以引入锁机制,来确保只有一个线程能够同时访问共享资源,从而避免…

    C# 2023年5月15日
    00
  • C#日历样式的下拉式计算器实例讲解

    下面我来详细讲解一下“C#日历样式的下拉式计算器实例讲解”的完整攻略。 一、准备工作 在开始之前,我们需要完成以下准备工作: 安装好Visual Studio开发环境 创建一个Windows Froms应用程序项目 在表单中添加控件:日历控件、文本框控件、下拉框控件、按钮控件等 二、编写代码 1. 日历控件的使用 首先,我们需要使用日历控件来获取日期。在窗体…

    C# 2023年6月6日
    00
  • php5 apache 2.2 webservice 创建与配置(java)

    PHP5Apache2.2Webservice是一个用于搭建PHP Web服务的工具。本文将为您提供使用PHP5Apache2.2Webservice创建和配置Web服务的完整攻略。 步骤1:安装PHP5Apache2.2Webservice环境 首先需要准备好服务器,确保服务器上已经安装了Apache、PHP和MySQL。然后可以从此处下载并安装PHP5A…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部