关于使用属性的虚拟关键字

时间:2013-11-05 07:01:23

标签: c# asp.net-mvc virtual

我见过人们将虚拟关键字用于这样的属性:

public class Client
{
    public virtual int? Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Lastname { get; set; }
    public virtual int? Age { get; set; }
    public virtual ISet<Login> Logins { get; set; }
} 

我们所知道的当我们声明任何虚拟的东西时,在派生类中我们可以覆盖它,但是还有另一个原因可以在属性上使用这个关键字吗?

如果你能用一个例子解释它可能会让事情变得清晰。

2 个答案:

答案 0 :(得分:3)

他们使用virtual关键字正是出于这个原因:允许派生类覆盖行为。属性具有可以覆盖的行为。仅仅因为这个基类使用自动属性并不意味着所有派生类都必须。

public class IdCheckingClient : Client
{
    private int? backingfieldId;

    public override int? Id
    {
        get { return backingfieldId; }
        set 
        {
           if(value.HasValue && value.Value < 0)
           {
               throw new ArgumentException("ID needs to be positive or null");
           }
           backingfieldId = value;
        }  
    }
} 

答案 1 :(得分:2)

就像Patryk所说,这是因为能够像NHibernate或Entity Framework这样的ORM顺利运行。然后,ORM在声明为虚拟的属性之上构建代理类,以便在它们上启用延迟加载(获取所有导航数据)。

示例:

public class User
{
   public int ID { get; set; }
   public virtual Role Role { get; set; }
}
public class Role
{
   public int ID { get; set; }
   public string Name { get; set; }
   public virtual List<User> UsersInRole { get; set; }
} 

获得用户后,您将自动获得相关角色。如果您获得角色,则会自动获得该角色中的所有用户。

实体框架文件:http://msdn.microsoft.com/en-us/data/jj679962