Em um artigo anterior abordei o uso de instâncias baseadas no tipo FrozenDictionary, uma nova alternativa que permite a criação de estruturas do tipo chave-valor imutáveis:
Novidades do .NET 8: estruturas chave-valor imutáveis com FrozenDictionary
Também integrando o namespace System.Collections.Frozen, temos ainda a possibilidade de criação de coleções baseadas no tipo FrozenSet. Além da questão da imutabilidade ao se trabalhar com sets/conjuntos, esta nova classe ainda é otimizada para uma maior performance em operações de leitura (como também acontece com FrozenDictionary).
Na listagem seguinte podemos observar a geração de um FrozenSet, por meio de uma chamada ao método ToFrozenSet (linha 20) e tomando por base uma instância da classe HashSet (este mesmo procedimento seria válido com um objeto do tipo SortedSet):
using System.Collections.Frozen;
using System.Runtime.InteropServices;
using System.Text.Json;
Console.WriteLine("***** Testes com .NET 8 | Colecoes imutaveis com FrozenSet *****");
Console.WriteLine($"Versao do .NET em uso: {RuntimeInformation
.FrameworkDescription} - Ambiente: {Environment.MachineName} - Kernel: {Environment
.OSVersion.VersionString}");
var campeoesMundiais = new HashSet<string>()
{
"Brasil",
"Italia",
"Alemanha",
"Argentina",
"Uruguai",
"Franca",
"Inglaterra",
"Espanha"
}.ToFrozenSet();
Console.WriteLine();
Console.WriteLine($"Quantidades de paises que ja venceram Copas: {campeoesMundiais.Count}");
Console.WriteLine();
Console.WriteLine("JSON com os campeoes da Copa do Mundo: ");
Console.WriteLine(JsonSerializer.Serialize(campeoesMundiais,
new JsonSerializerOptions() { WriteIndented = true }));
.NET 8
Ao tentar remover um valor existente (invocação do método Remove) ocorrerá um erro, como indicado na imagem seguinte (operações que produzem modificações na coleção não são possíveis com um FrozenSet):
LEIA TAMBÉM: .NET 7 + Minimal APIs: versionando APIs REST de forma descomplicada
O resultado da execução desta Console Application a partir do Visual Studio 2022 pode ser observado na próxima imagem:
LEIA TAMBÉM: .NET MAUI – Menu de navegação Flyout
Este exemplo foi disponibilizado como um repositório do GitHub:
https://github.com/renatogroffe/DotNet8-ConsoleApp-FrozenSet
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!
Referências
.NET 8 – Guia de Referência: artigos, dicas, vídeos e exemplos de utilização
What’s new in .NET 8 | Microsoft Learn






