Stavo leggendo Improving .NET Application Performance and Scalability. La sezione intitolata Evitare ripetitivo campo o la proprietà di accesso contiene una linea guida:Ottimizzazione del compilatore delle proprietà che rimangono statiche per la durata di un ciclo
Se si utilizzano i dati che è statico per tutta la durata del ciclo, ottenerla prima del ciclo anziché più volte l'accesso a un campo o una proprietà.
Il seguente codice è dato come un esempio di questo:
for (int item = 0; item < Customer.Orders.Count; item++)
{
CalculateTax(Customer.State, Customer.Zip, Customer.Orders[item]);
}
diventa
string state = Customer.State;
string zip = Customer.Zip;
int count = Customers.Orders.Count;
for (int item = 0; item < count; item++)
{
CalculateTax(state, zip, Customer.Orders[item]);
}
L'articolo afferma:
Nota che se questi sono i campi, è potrebbe essere possibile per il compilatore di fare questa ottimizzazione automatica lly. Se sono proprietà, è molto meno probabile . Se le proprietà sono virtuali, non può essere eseguito automaticamente .
Perché è "molto meno probabile" che le proprietà vengano ottimizzate dal compilatore in questo modo e quando è possibile che una particolare proprietà sia o non sia ottimizzata? Suppongo che le proprietà in cui vengono eseguite operazioni aggiuntive negli accessor siano più difficili da ottimizzare per il compilatore e che quelle che modificano solo un backing field abbiano maggiori probabilità di essere ottimizzate, ma vorrebbero regole più concrete. Le proprietà auto-implementate sono sempre ottimizzate?
E anche se * fa * restituisce semplicemente il valore di un campo di supporto, il compilatore dovrebbe dimostrare che il campo di supporto non può mai cambiare nel ciclo, e questa è una cosa difficile (spesso impossibile) da provare in la maggior parte dei casi. – Servy
@Servy: Sì, ma credo che sia più o meno lo stesso di "Nota che se questi sono campi, potrebbe essere possibile per il compilatore eseguire automaticamente questa ottimizzazione" –
Se il compilatore può provare che la proprietà * solo * restituisce il valore di un campo, * allora * è lo stesso. Può o non può sapere se la proprietà fa proprio questo. – Servy