E 'mai appropriato alle proprietà di carico pigro?

4

Considera il seguente programma inventato:

class Program
{
    static void Main(string[] args)
    {
        var myClass = new MyClass();
        var stuff = myClass.MyProperty; // this takes 5 seconds
        var stuff2 = myClass.MyProperty; // this is effectively instantaneous
    }
}

class MyClass
{
    private Lazy<IEnumerable<string>> _myProperty =
        new Lazy<IEnumerable<string>>(MyService.TimeConsumingLoadOperation);

    public IEnumerable<string> MyProperty
    {
        get { return _myProperty.Value; }
    }
}

class MyService
{
    public static IEnumerable<string> TimeConsumingLoadOperation()
    {
        Thread.Sleep(5000);
        return new List<string>();
    }
}

Disegno da parte di CA1024 :

Properties should behave as if they are fields; if the method cannot, it should not be changed to a property.

Questo ha molto senso per me. Non mi aspetto che l'accesso alla proprietà possa comportare un ritardo notevole e il codice sopra sarebbe più chiaro se MyProperty è stato recuperato in una chiamata al metodo. A tal fine, ci sono situazioni in cui il caricamento lazy di una proprietà (rispetto all'uso di un metodo) sarebbe appropriato?

    
posta Will Ray 17.11.2015 - 20:44
fonte

1 risposta

2

Sì, ovviamente il caricamento lento di una proprietà è molto spesso appropriato, dal momento che si subisce una penalità solo una volta, mentre da quel momento il recupero del valore della proprietà è istantaneo.

Qualcuno potrebbe obiettare che è inaccettabile subire la penalità di caricamento sulla prima query senza aspettarselo; la risposta a questo è che al contrario, è inaccettabile subire la penalità di precaricamento durante l'avvio, (nel qual caso siamo in genere sovraccaricati in ogni caso) caricando il valore di una proprietà che non siamo nemmeno sicuri se sarà mai essere interrogato.

Le cose diventano un po 'più complicate se si considerano scenari in cui la proprietà non è solo carico-una-volta-query-perenne-dopo, ma carico-non frequente-query-frequentemente. Quanto è raro che il caricamento lento debba essere bilanciato dalle frequenti query veloci prima che diventi necessario pubblicizzare la potenziale lentezza di qualsiasi query trasformando la proprietà in un metodo? Questa è una domanda a cui devi rispondere caso per caso.

Correlati: Quanta logica in Getters

    
risposta data 06.12.2015 - 00:56
fonte

Leggi altre domande sui tag