0

我见过人们使用 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; }
} 

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

如果你可以用一个例子来解释它,它可能会澄清事情。

4

2 回答 2

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;
        }  
    }
} 
于 2013-11-05T07:07:40.797 回答
2

就像 Patryk 所说的那样,它是为了能够与 NHibernate 或实体框架之类的 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

于 2013-11-05T07:23:40.390 回答