为什么我需要在c#类中使用虚拟修饰符?

时间:2012-03-17 13:41:32

标签: 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; }
}

有人可以解释为什么他们的客户信息是用虚拟编码的。这是什么意思?

3 个答案:

答案 0 :(得分:5)

根据评论判断,您正在学习实体框架吗?

虚拟此处意味着您正在尝试使用延迟加载 - 当客户等相关项目可以由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; } 
}

答案 1 :(得分:4)

  
    

有人可以解释为什么他们的客户信息是用虚拟编码的。这是什么意思?

  

虚拟关键字意味着从此基类派生的超类(即交付)可以覆盖该方法。

如果该方法未标记为虚拟,则无法覆盖该方法。

答案 2 :(得分: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类的实际实例类型具有非常奇怪的名称,因为它们是即时生成的。