2012-01-11 11 views
6

Per definizione le proprietà o i metodi virtuali sono metodi visibili per le sottoclassi da sovrascrivere. Tuttavia, NHibernate ad esempio utilizza proprietà virtuali per garantire un caricamento lento.proprietà virtuali e caricamento lazy

La mia domanda non riguarda NHibernate, ma come si possono utilizzare le proprietà virtuali per ottenere un caricamento lento? Esistono comportamenti nascosti sulle proprietà virtuali che non conosco?

risposta

9

Il fatto che siano dichiarati virtuali consente a NHibernate di sovrascrivere la proprietà e creare un'implementazione proxy per esso - il proxy a sua volta può utilizzare per implementare il caricamento lento al primo accesso della proprietà.

+0

fa Nhibere ereditare la tua classe? –

+0

Sì, è per questo che ha bisogno di 'virtuale'. In questo modo è possibile sostituire la proprietà con il codice per recuperare i dati quando si accede. – ChrisAnnODell

+0

@ChrisAnnODell come una classe potrebbe ereditato in fase di runtime? Non c'è modo di ottenere questo con la riflessione –

2

Non vi è alcun comportamento nascosto dietro i membri virtual. Tranne il fatto non così nascosto che possono essere sovrascritti in classi figlio.

Il caricamento lento può essere ottenuto utilizzando la classe Lazy<T>. In cui T è il tipo che verrà caricato. Converte implicitamente in T.

Oppure, se si desidera impostare manualmente le proprietà di comportarsi pigro si potrebbe usare qualcosa di simile:

private SomeType _someProperty = null; 
public override SomeType SomeProperty 
{ 
    get 
    { 
     if (_someProperty == null) 
     { 
      // Load _someProperty 
     } 
     return _someProperty; 
    } 
} 

Con ValueTypes è possibile scegliere di renderli Nullable<T>. O introdurre uno bool se sono caricati o meno.

+0

Cosa succede se non ha accesso a Lazy ? E come si può raggiungere la pigrizia con virtuale/override? Penso che questo significhi OP. – oleksii

+0

pigrizia manuale. Permettetemi di specificarlo. – Aidiakapi

Problemi correlati