{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
18/05/2010
Fala galera, lendo algumas coisas sobre MEF acabei conhecendo um novo tipo disponível no .NET 4: [Lazy<
T>
](http://msdn.microsoft.com/en-us/library/dd642331(v=VS.100).aspx).Este novo tipo, Lazy<
T>
, nos possibilita adiar a inicialização do seu valor até o momento do uso.Imagine que o tipo T é um tipo complexo que demanda muito processamento para ser criado, utilizando o Lazy é possível que esta inicialização seja adiada o máximo possível, até o momento da chamada ao valor.Vejamos no exemplo abaixo:
Lazy<string> lazy = new Lazy<string>(() =>{ Thread.Sleep(3000);
return "Conteúdo";
}
);
Console.WriteLine("Criado: {
}
\n", lazy.IsValueCreated);
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine("Valor: {
}
", lazy.Value);
sw.Stop();
Console.WriteLine("Tempo 1ª chamada: {
}
\n", sw.Elapsed);
Console.WriteLine("Criado: {
}
\n", lazy.IsValueCreated);
sw = new Stopwatch();
sw.Start();
Console.WriteLine("Valor: {
}
", lazy.Value);
sw.Stop();
Console.WriteLine("Tempo 2ª chamada: {
}
\n", sw.Elapsed);
</string></string>
Nas linhas 1 a 5 estamos criando um Lazy<
string>
. Ok, isso não é um cenário real, mas estamos dizendo que para a criação deste tipo a Thread deverá dormir por 3 segundos. Estou utilizando o Lazy pois não quero que a Thread congele no momento da instanciação deste objeto, mas sim no momento da utilização do mesmo.O Lazy<
T>
possui 2 propriedades públicas: _[IsValueCreated](http://msdn.microsoft.com/en-us/library/dd642334(v=VS.100).aspx)_ que é um booleano indicando se o valor já foi inicializado ou não. E também _[Value](http://msdn.microsoft.com/en-us/library/dd642177(v=VS.100).aspx)_, que retorna o valor armazenado.O restante do código é bem simples, na_ **linha 7**_ apenas verificamos se o valor já está criado, que deve ser falso. Na _**linha 11**_ fazemos a chamada para a propriedade Value, e isto fará com que a Thread congele por 3 segundos e nossa string seja de fato criada. Na _**linha 13**_ escrevo no console o tempo que demorou a invocação da propriedade Value, que deve ser de cerca de 3 segundos.Depois repito este processo para verificar o tempo gasto, que será muito menor do que 3 segundos, pois nosso valor já foi inicializado anteriormente.Confira abaixo a saída do programa:[![Lazy<t> resultado no console](http://viniciusquaiato.com/images_posts/lazy_t_.png "Lazy<t> resultado no console")</t></t>](http://viniciusquaiato.com/images_posts/lazy_t_.png)
É isso galera, fica aí mais uma dica e novidade do .net 4.
Abraços, Vinicius Quaiato.