2013-05-03 3 views
6

Questa potrebbe essere una domanda stupida. So che il compilatore rimuoverà i locali non utilizzati. Ma se scrivo il mio codice come questo:Il compilatore C# rimuoverà il locale inutilizzato se viene assegnata una proprietà?

class MyClass 
{ 
    public int SomeProperty 
    { 
     get 
     { 
      ... 
     } 
    } 

    public void SomeFunction() 
    { 
     //will this line be removed if i is never used? 
     int i = SomeProperty; 
     ... 
    } 
} 

Mi chiedo che se i verranno rimossi dal compilatore a causa di ottimizzazione. C'è logica all'interno del getter di SomeProperty che desidero eseguire. Se i verrà rimosso, devo cambiare SomeProperty in una funzione.

Btw, c'è un modo per sapere quale linea verrà ottimizzata dal compilatore?

+0

Starai bene! Compilatore è abbastanza intelligente da sapere – Charleh

+15

Suggerirei che ciò che fa il compilatore non è importante. Questo è un cattivo design. Se chiamare un getter ha importanti effetti collaterali, allora probabilmente non dovrebbe essere un getter. La cosa più probabile che un getter dovrebbe fare è l'inizializzazione pigra di qualcosa, e questo non dovrebbe essere importante, perché se non dovesse accadere, sarà fatto dalla prossima cosa per ottenerlo. Non so cosa stai facendo, ma probabilmente dovrebbe essere refactored nel proprio metodo che può essere chiamato esplicitamente a quel punto. Se non altro, qualcun altro che guarda il codice potrebbe rifarlo come un inutile incarico ... – Chris

+2

Correlato: http://stackoverflow.com/a/2162893/284240 "** Il compilatore C# non fa mai questo tipo di ottimizzazione ** come indicato, fare ciò richiederebbe che il compilatore esegua peer nel codice che viene chiamato e verifichi che il risultato che calcola non cambi durante la durata del codice del callee.Il compilatore C# non lo fa ** Il compilatore JIT potrebbe. ** " –

risposta

9

Suggerirei che ciò che fa il compilatore non è importante. Questo è un cattivo design.

Se chiamare un getter ha importanti effetti collaterali, non dovrebbe probabilmente essere un getter. La cosa più probabile che un getter dovrebbe fare è l'inizializzazione pigra di qualcosa, e questo non dovrebbe essere importante, perché se non dovesse accadere, sarà fatto dalla prossima cosa per ottenerlo.

Non so cosa si sta facendo ma probabilmente dovrebbe essere refactored nel proprio metodo che può essere chiamato esplicitamente a quel punto.

L'altra grande preoccupazione riguarda la leggibilità. Chiunque veda la linea int i = SomeProperty; quando i non viene mai più utilizzato potrebbe decidere che la linea è inutile e non fa nulla e quindi rimuoverla dal codice causando qualsiasi errore imprevisto. Sarebbe meglio chiamare un metodo come LogicExtractedFromProperty() quindi è ovvio che stai facendo qualcosa.

Il compilatore potrebbe (o non potrebbe, non so o non cura) fare la cosa giusta ma una persona potrebbe non farlo.

+0

+1: per i tuoi due centesimi –

+0

grazie ragazzi! È un pezzo di codice che ho visto nel nostro software.Solo curioso di sapere se funzionerà davvero :) – Xinchao

+1

E se quel getter di proprietà è un pigro .Valore? Non posso cambiare il suo design. So che la prima idea sarebbe quella di non usare Lazy se ne ho bisogno immediatamente, ma è solo parziale e non sempre necessario. Ma a un certo punto devo precaricare il valore e restituire l'oggetto pigro inizializzato . È pericoloso e può essere modificato nelle future versioni del compilatore, ad esempio? –

Problemi correlati