Зачем мне нужно использовать виртуальный модификатор в классе С#?

У меня есть следующий класс:

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; }
}

Может кто-нибудь объяснить, почему информация о клиенте закодирована с помощью виртуального. Что это значит?

Ответ 1

Предположим, вы используете EF.

Что происходит, когда вы создаете виртуальную виртуальную машину NavigationProperty, это то, что EF динамически создает производный класс.
Этот класс реализует функциональность, которая позволяет выполнять ленивую загрузку и другие задачи, такие как поддержание отношений, которые EF выполняет для вас.

Просто, чтобы понять, что ваш класс образцов динамически становится примерно таким:

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
     }
   }
}

Вы можете легко увидеть это во время отладки, фактические типы экземпляров ваших классов EF имеют очень странные имена, поскольку они генерируются на лету.

Ответ 2

Судя по комментариям, вы изучаете Entity Framework?

virtual здесь означает, что вы пытаетесь использовать ленивую загрузку - когда связанные элементы, такие как Customer, могут быть загружены EF автоматически

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

Например, при использовании класса сущности Princess, определенного ниже, соответствующие единороги будут загружены при первом доступе к навигационному свойству Unicorns:

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

Ответ 3

Может кто-нибудь объяснить, почему информация о клиенте закодирована с помощью виртуального. Что это значит?

Виртуальное ключевое слово означает, что суперкласс, полученный из этого базового класса (то есть доставки), может переопределить этот метод.

Если метод не был помечен как виртуальный, тогда было бы невозможно переопределить этот метод.