C# - IReadOnlyCollections (revisitado)
Hoje vamos rcordar como usar as interfaces genéricas somente leitura no C#. |
Hoje veremos as interfaces genéricas somente leitura como IReadOnlyCollection, IReadOnlyDictionary e IReadOnlyList da plataforma .NET que permitem implementar coleções somente leitura.
Podemos aproveitar as interfaces genéricas somente leitura, como IReadOnlyList, IReadOnlyDictionary e IReadOnlyCollection para evitar modificações em coleções usadas em aplicações .NET Core.
Uma coleção
representa um conjunto de objetos usados para armazenamento e recuperação de
dados. As coleções permitem alocar memória dinamicamente para armazenar
elementos e recuperá-los usando uma chave ou índice conforme necessário.
Você pode ter coleções padrão ou genéricas onde as coleções padrão não forneçam
segurança de tipo e as coleções genéricas são seguras de tipo. As coleções
padrão fazem parte do namespace System.Collections
e as coleções genéricas fazem parte do namespace System.Collections.Generic.
Um objeto imutável é definido como um objeto que não pode ser alterado após ter sido criado. Nem todas as coleções são imutáveis, mas você pode usar os tipos de coleção somente leitura no .NET Core, como IReadOnlyList, IReadOnlyDictionary e IReadOnlyCollection para implementar tipos imutáveis. Todos eles fazem parte do namespace System.Collections.Generic.
O principal benefício destes recursos é que as novas interfaces são covariantes, exceto IReadOnlyDictionary. Isso significa que você pode usar um tipo derivado como parâmetro genérico ao passar uma coleção para um método definido para um tipo base. Se você tem uma classe Carro, por exemplo, que deriva de Veiculo, você pode ter um método que aceita um IReadOnlyList<Veiculo> e passa um IReadOnlyList<Carro>.
Vejamos um exemplo de código que demonstra o uso de vários membros da classe ReadOnlyCollection<T>.
Neste
exemplo vamos
criar um List<T> de strings e adicionar quatro
nomes de carros a ele. A seguir vamos envolver a lista em um
ReadOnlyCollection<T>.
Depois de demonstrar os membros Count, Contains, Item[] e
IList.IndexOf, o exemplo mostra que o ReadOnlyCollection<T> é apenas um
wrapper para o List<T> original adicionando um novo
item ao List<T> e exibindo o conteúdo do
ReadOnlyCollection<T>.
Por fim, vamos criar uma matriz maior que a coleção e usar o método
CopyTo para inserir os elementos da coleção no meio
da matriz.
Para isso vamos criar um projeto Console no .NET 6.
using System.Collections.ObjectModel; Console.WriteLine("\n### Usando ReadOnlyCollection<T> ###\n"); //criando a lista de strings //envolvendo a lista em um ReadonlyCollection //exibindo os itens da lista //contando os itens //verificando se a lista contém um item Console.WriteLine($"\nreadOnlyCarros[3]: {readOnlyCarros[3]}"); Console.WriteLine("\nInserir na lista:"); Console.WriteLine(); //criando uma matriz maior que a coleção e copiando os elementos da coleção na matriz Console.WriteLine($"\nO array copiado tem {carroArray.Length} elementos:"); Console.ReadKey();
|
Resultado da execução do código acima:
Uma instância da classe genérica ReadOnlyCollection<T>
é sempre somente leitura, e , uma coleção que é somente leitura é simplesmente
uma coleção com um invólucro que impede a modificação da coleção; portanto, se
forem feitas alterações na coleção subjacente, a coleção somente leitura
refletirá essas alterações.
Usando IReadOnlyList
Vejamos agora um exemplo de IReadOnlyList.
Vamos supor que temos a classe Aluno com um método estático que retorna uma lista de alunos e que defina a lista usando IReadOnlyList<Aluno> :
namespace CShp_IReadOnlyCollections;
public class Aluno public static IReadOnlyList<Aluno> GetAlunos() |
Na classe Program vamos incluir o código a seguir para acessar a lista e exibir os alunos:
using CShp_IReadOnlyCollections; var alunos = Aluno.GetAlunos(); foreach(var aluno in alunos) Console.Read(); |
Vamos verificar o tipo alunos que é um IReadOnlyList e verificamos não temos o método Add que permite incluir um elemento na lista justamente por ser uma lista somente leitura:
Com isso podemos evitar que os dados de uma coleção sejam alterados usando o tipo IReadOnlyList.
Pegue o projeto aqui: CShp_IReadOnlyCollections.zip
"Sede unânimes
entre vós; não ambicioneis coisas altas, mas acomodai-vos às humildes; não
sejais sábios em vós mesmos;"
Romanos 12:16
Referências:
ASP .NET - Gerando QRCode com a API do Google
C# 9.0 - Instruções de nível superior
ASP.NET Core Web API - Apresentando API Analyzers
ASP.NET Core - Usando o token JWT com o Swagger