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