尝试C# 9.0新特性

仅初始化属性 init-only

init 关键字,可以在类创建的时候赋值一次,如下代码所示:

    public class InitOnlyClass
    {
        public string FirstName { get; init; }

        public string LastName { get; init; }
    }

    static void Main(string[] args)
    {
        InitOnlyClass initOnlyClass = new InitOnlyClass
        {
            FirstName = "firstName"
        };

        System.Console.WriteLine(initOnlyClass.FirstName);

        // 这样会报错。
        // initOnlyClass.LastName = "lastName";
    }

此种方式只是多了一种构造函数的实例的方式

record 关键字

实际上是一个继承了IEquatable<Data>的类,个人理解为一个类似dto的类,只用于记录值。 这个类只用于传输数据,比如用来json序列化。

语法

public record Data
{
    public string Const { get; init; }
    public string Content { get; init; }
}

with 关键字

如果需要更改Data数据只能复制一个,然后修改特定的值即可。如代码所示:

var data = new Data { Const = "固定内容", Content = "旧内容" }

// 这是要新修改的内容,其余内容将会直接复制。
var newData = data with { content = "新的内容" };
var jsonResult = JsonSerializer.Serialize(newData);

位置记录,实现Deconstruct方法

    public record Data
    {
        private int _id;
        private string _content;

        public Data(int id, string content, bool d = false)
        => (_id, _content) = (id, content);

        public void Deconstruct(out int id, out string content)
         => (id, content) = (_id, _content);
    }

    var data = new Data(1, "发送的内容");

    // 获得数据里面的内容,必须实现Deconstruct 方法。
    var (d, c) = data;

更加简单的实现Data的方式

    // 已经实现Deconstruct。
    public record DataSimple(string Id, string Content);
    var (d, c) = data;

顶级程序

直接在program中写逻辑,比如简单的表达式,除了需要(用到时)引入命名空间,有点像写PowerShell

    System.Console.WriteLine("Hello Wrold!");

匹配模式 swith C# 8.0的加强版

using InitOnlyDemo;

// 最简单的匹配程序
int tag = -1;
int result = -1;

// 最基本的。
switch (tag)
{
    case 0:
        result = 1;
        break;

    case 1:
        result = 2;
        break;

    case 2:
        result = 3;
        break;

    default:
        result = 4;
        break;
}

System.Console.WriteLine(result);

// C# 8.0。
tag = -1;
result = -1;
result = tag switch
{
    -1 when result == -1 => 1, // 当tag等于-2时,也返回1。
    0 => 1,
    1 => 2,
    3 => 3,
    _ => 4,
};

System.Console.WriteLine($"C# 8 => {result}");

// C# 9.0 加入关系模式
tag = 0;
result = -3;
result = tag switch
{
    -1 when result > -1 => result switch  // 在嵌套一个。
    {
        _ => 0
    },
    0 when result <= -1 => result switch
    {
        < -2 and > -4 => 1,  // 逻辑模式,可用用and or not 判断
        _ => 0
    },
    1 => 2,
    3 => 3,
    _ => 4,
};

System.Console.WriteLine($"C# 9 => {result}");

自动推断类型

在new对象十分好用。但当需要引入新命名空间才能使用的对象时(通常在接收返回值),还是var xx=x.GetX(); 这种类型好用。

var data8 = new Data(1, "需要的内容");

// C# 9.0。
Data data9 = new(1, "需要的内容");
A a = new() { };
原文地址:https://www.cnblogs.com/yeqifeng2288/p/13582857.html