我见过人们将虚拟关键字用于这样的属性:
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; }
}
我们所知道的当我们声明任何虚拟的东西时,在派生类中我们可以覆盖它,但是还有另一个原因可以在属性上使用这个关键字吗?
如果你能用一个例子解释它可能会让事情变得清晰。
答案 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; }
}
获得用户后,您将自动获得相关角色。如果您获得角色,则会自动获得该角色中的所有用户。