.NET 9 中的新功能一览

.NET 9 Preview 1已经发布,在.NET 9 中,新增了一些功能,包括JSON序列化、LINQ、Cryptography、SignalR和字典(Dictionary)调试等。本文介绍.NET 9中JSON的一些变化。

JSON

JsonSerializerOptions 的 Web 默认值

System.Text.Json中,.NET 9为序列化JSON提供了新的选项,并且增加了一个新的单例,这使得使用Web默认设置进行序列化变得更加容易。在 .NET 9 及更高版本中,可使用 JsonSerializerOptions.Web 单一实例通过 ASP.NET Core 用于 Web 应用的默认选项进行序列化。
代码如下:

public class Forecast{
    public DateTime? Date { get; init; }
    public int TemperatureC { get; set; }
    public string? Summary { get; set; }}Forecast forecast = new(){
    Date = DateTime.Now,
    TemperatureC = 40,
    Summary = "Hot"};JsonSerializerOptions options = new(JsonSerializerDefaults.Web){
    WriteIndented = true};

或者

string webJson = JsonSerializer.Serialize(
    new { SomeValue = 42 },
    JsonSerializerOptions.Web // Defaults to camelCase naming policy.
    );Console.WriteLine(webJson);// {"someValue":42}

缩进

.NET 9 中的JsonSerializerOptions 包含一些新属性,可用于自定义写入 JSON 的缩进字符和缩进大小。例如:

var options = new JsonSerializerOptions{
    WriteIndented = true,
    IndentCharacter = '\t',
    IndentSize = 2,};string json = JsonSerializer.Serialize(
    new { Value = 1 },
    options    );Console.WriteLine(json);

LINQ

Linq引入了两个新的方法CountBy AggregateBy CountBy 用于快速计算每个键出现频率的方法。AggregateBy 用于将数据分组,并对每个组执行聚合操作(例如求平均值、计数等)。

CountBy示例

string sourceText = """
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    Sed non risus. Suspendisse lectus tortor, dignissim sit amet, 
    adipiscing nec, ultricies sed, dolor. Cras elementum ultrices amet diam.""";KeyValuePair<string, int> mostFrequentWord = sourceText    .Split(new char[] { ' ', '.', ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(word => word.ToLowerInvariant())
    .CountBy(word => word)
    .MaxBy(pair => pair.Value);Console.WriteLine(mostFrequentWord.Key); // amet

上面代码会计算出给定文本中出现次数最多的单词。其中
sourceText 是一段需要统计的文本。
.Split(new char[] { ' ', '.', ',' }, StringSplitOptions.RemoveEmptyEntries),将文本按照空格、句号和逗号进行分割,同时去除空字符串。
.Select(word => word.ToLowerInvariant()) 将每个单词转换为小写字母。
使用.CountBy(word => word) 对字符串集合进行分组,每个组包含相同单词的单词列表,返回一个字典数据结构 KeyValuePair<string, int>。键 (key) 是单词,值 (value) 是出现次数。
最后使用MaxBy(pair => pair.Value)对字典进行排序。最终结果是amet出现的最多。

AggregateBy 示例

(string id, int score)[] data =
    [
        ("0", 42),
        ("1", 5),
        ("2", 4),
        ("1", 10),
        ("0", 25),
    ];var aggregatedData =
    data.AggregateBy(
        keySelector: entry => entry.id,
        seed: 0,
        (totalScore, curr) => totalScore + curr.score        );foreach (var item in aggregatedData){
    Console.WriteLine(item);}//(0, 67)//(1, 15)//(2, 4)

上面代码比较简单,将定义好的数组,通过AggregateBy 方法对数组data进行聚合操作。得到最终结果

//(0, 67)//(1, 15)//(2, 4)

Cryptography 和 SignalR

Cryptography 增加了新的静态哈希方法,例如:

byte[] hash = CryptographicOperations.HashData(hashAlgorithmName, data);

这样就可以省钱new来new去的操作。
Cryptography 还增加了一个KMAC算法,简单示例如下:

byte[] key = GetKmacKey();byte[] input = GetInputToMac();byte[] mac = Kmac128.HashData(key, input, outputLength: 32);

KMAC使用Keccak 哈希函数,而HMAC使用SHA哈希函数。 Keccak被认为是更安全的哈希函数,因为它具有更高的抗碰撞性。因此KMAC被认为比HMAC更安全,因为它使用了两轮哈希函数,并采用了密钥填充技术。

目前互联网上KMAC的讨论比较少,因为它是一个较新的算法,所以兼容性等方面还差一些。如果是对安全性较高的场景,如金融交易、身份认证等方面,使用KMAC是个不错的选择。

SignalR中心方法现在可接受基类(而不是派生类)来实现多态方案。

字典(Dictionary)调试

字典和其他键值集合的调试显示具有改进的布局。 键显示在调试程序的键列中,而不是与值连接在一起。 下图显示了调试程序中字典的旧显示和新显示。
.之前:

在这里插入图片描述

以后:
在这里插入图片描述
好啦,目前.NET 9 Preview 1的新增功能就说这么多了,其他零碎的新功能就不多说了,之后的文章会再进行跟进。

最后说一下,.NET 9跟.NET 7一样,是标准期限支持。所以呢,还是等长期支持的.NET 10吧!