venerdì 31 maggio 2013

How to: C# Lazy ( Side effect )

Recentemente mi sono confrontato con un cordiale discorso di performance.

La maggior parte delle nostre applicazione vive l'ansia di dover caricare dei dati, e a dispetto delle mille possibilità  (leggasi "entity framework" ) non sempre possiamo rivolgerci ad estrattori specifici, o di contro questi sono rappresentati da elementi che wrappano i vare ef.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LazyTester
{
    public class entity
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }    
    }

    public class entites : List<entity>
    {
        public entites()
        {
            this.Add( new entity(){
                    ID=1,
                    Name = "Fabio",
                    Surname ="Arosio"});

            this.Add( new entity(){
                    ID=2,
                    Name = "Claudio",
                    Surname ="Arosio"});
            
            this.Add( new entity(){
                    ID=3,
                    Name = "Lorenzo",
                    Surname ="Arosio"});
            
            this.Add( new entity(){
                    ID=4,
                    Name = "Federico",
                    Surname ="Arosio"});
            
            Console.WriteLine("done");
        }    
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Lazy...");
            Lazy<entites> ldsE = new Lazy<entites>();
                       

            Console.WriteLine("Normal...");
            entites dsE = new entites();
          
            Console.WriteLine("Normal:"+ dsE.Count.ToString());

            Console.WriteLine("Lazy:" + ldsE.Value.Count.ToString());

            Console.ReadLine();
        }
    }
}


Questo esempietto anche se molto molto scarno presenta il vantaggio di un costruttore Lazy.

già nel nome ben si comprende che cosa farà ma in breve possiamo ipotizzare che quanto costruito come lazy non sarà disponibile fin da subito.
Tanto che la "done" sulla console appare appena prima di della WriteLine Lazy.

Supponiamo giusto per dare visibiltà della situazione che il caricamento differito dei dati avrà luogo solo quando questi saranno necessari e di contro questo "sposta il tempo d'accesso" solo e soltanto a quando questi servono davvero.


var ldsEE = new Lazy<entites>().Value.Where (c=> c.Name.StartsWith("F"));


Ci è lecito pensare e implementare anche in questo modo .. ma perdendone qualche beneficio..

Sicuramente credo che sia sempre cosa buona e giusta sperimentare. !

Nessun commento: