C# - Adiando a avaliação de valores até a referência


 Hoje vamos recordar como podemos adiar a avaliação de valores até que sejam referenciados e efetivamente acessados.

A classe Lazy<T> dá suporte a inicialização tardia ou lenta e permite que a sua criação seja postergada, adiada, diferida até que ele seja usado pela primeira vez.

Eu já abordei esse assunto em outro artigo e por isso vamos direto para o exemplo onde vamos usar a classe auxiliar  Lazy<T> para agrupar a criação de valor e passar o valor conforme necessário.

Depois que o valor for criado, ele será armazenado para que os acessos subseqüentes usem o valor já criado adie a avaliação do valor até a sua referência.

'Bora' pro código...

Criando o projeto exemplo

Crie um projeto do tipo Console (.NET Core).

A seguir defina o código abaixo na classe Program:

using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace CShp_Lazy
{
    class Program
    {
        static void Main(string[] args)
        {
              //delegate anônimo para fazer a criação do valor quando preciso
              Lazy<ICollection<string>> processos = new Lazy<ICollection<string>>(
              () =>
              {
                  List<string> nomesProcessos = new List<string>();

                  foreach (var p in Process.GetProcesses())
                  {
                      nomesProcessos.Add(p.ProcessName);
                  }
                  return nomesProcessos;
              });  
              ImprimeInfoSystem(processos, true);
              Console.ReadKey();
        }
        static void ImprimeInfoSystem(Lazy<ICollection<string>> nomesProcessos, bool exibeProcessos)
        {
            Console.WriteLine($"MachineName: {Environment.MachineName}");
            Console.WriteLine($"OS version: {Environment.OSVersion}");
            Console.WriteLine($"DBG: A lista de processos foi criada ? {nomesProcessos.IsValueCreated}");

            if (exibeProcessos)
            {
                Console.WriteLine("Processos: ");
                foreach (string p in nomesProcessos.Value)
                {
                    Console.WriteLine(p\t\t);
                }
            }
            Console.WriteLine($"DBG: A lista de processos foi criada ? {nomesProcessos.IsValueCreated}");
        }
    }
}

Vemos a utilização da classe Lazy<T> envolvendo a coleção de processos obtidos que serão avaliados somente quando acessarmos os dados obtidos:

Executando o projeto teremos:

Pegue o projeto aqui : CShp_Lazy.zip

"Porque do céu se manifesta a ira de Deus sobre toda a impiedade e injustiça dos homens, que detêm a verdade em injustiça."
Romanos 1:18

Referências:


José Carlos Macoratti