2012-03-17 14 views
10

Ho la seguente classe:Perché dovrei usare un modificatore virtuale in una classe C#?

public class Delivery 
{ 
// Primary key, and one-to-many relation with Customer 
    public int DeliveryID { get; set; } 
    public virtual int CustomerID { get; set; } 
    public virtual Customer Customer { get; set; } 

// Properties 
    string Description { get; set; } 
} 

Qualcuno può spiegare il motivo per cui le informazioni del cliente è codificata con virtuale. Cosa significa?

risposta

1

Immagino che si sta utilizzando EF.

Ciò che accade quando si effettua un virtual NavigationProperty è che EF crea dinamicamente una classe derivata.
Questa classe implementa funzionalità che consentono il caricamento lazy e altre attività come il mantenimento delle relazioni che EF esegue per voi.

Solo per ottenere l'idea la classe del campione diventa dinamicamente qualcosa di simile:

public class DynamicEFDelivery : Delivery 
{ 
    public override Customer Customer 
    { 
    get 
    { 
     return // go to the DB and actually get the customer 
    } 
    set 
    { 
     // attach the given customer to the current entity within the current context 
     // afterwards set the Property value 
    } 
    } 
} 

si può facilmente vedere questo il debug, mentre, i tipi istanza effettiva delle classi EF hanno nomi molto strani, dal momento che vengono generati al volo.

5

A giudicare dai commenti, stai imparando Entity Framework?

virtuale qui significherebbe che si sta tentando di utilizzare lazy loading - quando gli elementi correlati come clienti possono essere caricate da EF automaticamente

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

Ad esempio, quando si utilizza la classe di entità principessa definito di seguito, il unicorni relativi verranno caricati la prima volta la proprietà di navigazione unicorni si accede:

public class Princess 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Unicorn> Unicorns { get; set; } 
} 
4

Qualcuno può spiegare il motivo per cui le informazioni del cliente è codificata con virtuale. Cosa significa?

Il virtuale parola significa che una super classe derivata da questa classe di base (cioè consegna) può sostituzione tale metodo.

Se il metodo non è stato contrassegnato come virtuale allora non sarebbe possibile sostituzione tale metodo.