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?