c# FrozenDictionary

FrozenDictionary 是 .NET 7 中引入的一个集合类型,它结合了字典的高效查找功能和不可变集合的特性。FrozenDictionary 提供了在创建后不可修改的字典,同时也优化了查找性能。

主要特点

不可变(Immutable):一旦创建,FrozenDictionary 的内容不可更改,这确保了数据的一致性和安全性。
高效查找:FrozenDictionary 内部结构经过优化,使得查找操作非常高效。
线程安全:由于不可变性,多个线程可以安全地访问同一个 FrozenDictionary 实例。

使用场景

FrozenDictionary 适用于以下场景:

配置管理:当你需要一个全局配置字典,并且不希望在运行时修改它。
常量映射:当你需要一个不可变的键值对映射,用于查找操作。
缓存机制:当你需要一个不可变的缓存,用于存储经常访问的数据。

基本语法

要使用 FrozenDictionary,首先需要引用 System.Collections.Frozen 命名空间。FrozenDictionary 是一个泛型集合类,存储键值对.

using System;
using System.Collections.Frozen;

public class Program
{
    public static void Main()
    {
        // 创建一个 FrozenDictionary
        var dictionary = FrozenDictionary.ToFrozenDictionary(
            new Dictionary<string, int>
            {
                ["One"] = 1,
                ["Two"] = 2,
                ["Three"] = 3
            });

        // 访问元素
        Console.WriteLine(dictionary["One"]); // 输出: 1
        Console.WriteLine(dictionary["Two"]); // 输出: 2

        // 尝试修改字典会抛出异常
        // dictionary["One"] = 10; // 抛出 System.InvalidOperationException
    }
}
创建 FrozenDictionary

你可以从现有的 IDictionary(如 Dictionary)或任何实现了 IEnumerable<KeyValuePair<TKey, TValue>> 的对象创建 FrozenDictionary。

var dictionary = FrozenDictionary.ToFrozenDictionary(
    new Dictionary<string, int>
    {
        ["One"] = 1,
        ["Two"] = 2,
        ["Three"] = 3
    });
使用 FrozenDictionary

一旦创建,FrozenDictionary 可以像普通的 IDictionary 一样使用,但它是不可变的,这意味着你不能添加、删除或修改其中的元素。

// 访问元素
Console.WriteLine(dictionary["One"]); // 输出: 1
Console.WriteLine(dictionary["Two"]); // 输出: 2

// 尝试修改字典会抛出异常
// dictionary["One"] = 10; // 抛出 System.InvalidOperationException
线程安全

由于 FrozenDictionary 是不可变的,因此它是线程安全的。多个线程可以同时读取 FrozenDictionary 中的数据,而不需要额外的同步机制。

// 在多线程环境中访问
Parallel.For(0, 1000, i =>
{
    var value = dictionary["One"]; // 安全访问
    Console.WriteLine(value);
});
与普通字典的对比

可变性对比:FrozenDictionary 是不可变的,一旦创建就不能修改,而普通的 Dictionary 是可变的。
性能对比:在查找操作上,FrozenDictionary 通常比 Dictionary 更快,尤其是在频繁访问相同键的情况下。
线程安全对比:FrozenDictionary 天生线程安全,而 Dictionary 在多线程环境中需要额外的同步机制。

上一篇:T11:优化器对比实验


下一篇:【阅读笔记】水果轻微损伤的无损检测技术应用