C# 关于属性的“使用虚拟关键字”
我见过有人用虚拟关键词来表示这样的财产:C# 关于属性的“使用虚拟关键字”,c#,asp.net-mvc,virtual,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<Log
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; }
}
公共类客户端
{
公共虚拟int?Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串Lastname{get;set;}
公共虚拟整数{get;set;}
公共虚拟ISet登录{get;set;}
}
当我们将任何东西声明为虚拟时,我们所知道的是,在派生类中,我们可以重写它,但在属性上使用此关键字是否还有其他原因
如果你能用一个例子来解释它,可能会把事情弄清楚。他们使用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;
}
}
}
公共类IdCheckingClient:客户端
{
私人int?backingfieldId;
公共覆盖int?Id
{
获取{return backingfieldId;}
设置
{
if(value.HasValue&&value.value<0)
{
抛出新ArgumentException(“ID需要为正或空”);
}
backingfieldId=值;
}
}
}
他们使用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;
}
}
}
公共类IdCheckingClient:客户端
{
私人int?backingfieldId;
公共覆盖int?Id
{
获取{return backingfieldId;}
设置
{
if(value.HasValue&&value.value<0)
{
抛出新ArgumentException(“ID需要为正或空”);
}
backingfieldId=值;
}
}
}
正如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; }
}
公共类用户
{
公共int ID{get;set;}
公共虚拟角色{get;set;}
}
公共阶级角色
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共虚拟列表用户角色{get;set;}
}
当您获得一个用户时,您将自动获得关联的角色。如果您获得了一个角色,您将自动获得该角色中的所有用户
实体框架文档:正如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; }
}
公共类用户
{
公共int ID{get;set;}
公共虚拟角色{get;set;}
}
公共阶级角色
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共虚拟列表用户角色{get;set;}
}
当您获得一个用户时,您将自动获得关联的角色。如果您获得了一个角色,您将自动获得该角色中的所有用户
实体框架的文档:看起来像NHibernate的POCO类。NHibernate在这些POCO之上构建了一个代理类,以便于延迟加载,因此它需要
virtual
properties…这看起来像NHibernate的POCO类。NHibernate在这些POCO之上构建了一个代理类,以便于延迟加载,因此它需要virtual
properties…u说:-这个ORM然后在声明为virtual的属性之上构建代理类,以便在这些属性上启用延迟加载。u plzz能否将我引向几篇文章,其中展示了虚拟关键字如何帮助实现延迟加载。感谢您希望使用的ORM。我个人更喜欢实体框架。以下是从EF开始的所有基本步骤。我总是先执行代码,以便最大限度地控制我的关系。这是一个实现了此功能的项目。我想知道如果您不使用ADO.NET而不是任何ORM@SamuraiJack取决于是否要生成派生类和重写属性。如果不是,那么no.u说:-这个ORM然后在声明为虚拟的属性之上构建代理类,以便在这些属性上启用延迟加载。u plzz能否将我引向几篇文章,其中展示了虚拟关键字如何帮助实现延迟加载。感谢您希望使用的ORM。我个人更喜欢实体框架。以下是从EF开始的所有基本步骤。我总是先执行代码,以便最大限度地控制我的关系。这是一个实现了此功能的项目。我想知道如果您不使用ADO.NET而不是任何ORM@SamuraiJack取决于是否要生成派生类和重写属性。如果不是,那么不是。我知道use virtual关键字&override relatiob,但我想知道virtual关键字如何帮助实现延迟加载。如果可能的话,请详细指导我。谢谢,我知道使用virtual关键字和override relatiob,但我想知道virtual关键字如何帮助实现延迟加载。如果可能的话,请详细指导我。谢谢