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

本文关键字:虚拟 为什么 | 更新日期: 2023-09-27 18:28:03

我有以下类:

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

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

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

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

这里的虚拟意味着你试图使用延迟加载——当像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实体类时,相关的独角兽将在第一次访问独角兽导航属性时加载:

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

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

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

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

猜测您正在使用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类的实际实例类型有非常奇怪的名称,因为它们是动态生成的。