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:
C# - StreamReader, StringReader e TextReader . Qual a
C# - Imprimindo um arquivo texto - Macoratti
C# - Usando OpenFileDialog - Macoratti
C# - Formatando arquivos textos