C# - 何时使用public int virtual,以及何时只使用public int

时间:2012-10-01 18:24:26

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework

我正在通过J Galloway的“Professional ASP.NET MVC 3”教程。在本教程中,Jon向我们展示了如何构建MVC音乐商店。

我正处于创建CS类的部分,首先使用EF代码对数据进行建模。

所有本书中的示例public virtual int property {get; set; }未经解释。虚拟这个词在任何地方都被塞满了。

在网络上的其他地方,我还没有看到虚拟术语用于任何形式的一致性。

有人可以向我解释一下:

  1. 在此特定背景下“虚拟”一词的目的
  2. 是否需要使用'虚拟'?
  3. 为什么有些人使用'虚拟'而其他人没有?
  4. 为什么有些人在定义外键时只使用'virtual'?
  5. “虚拟”一词的最佳实践用法是什么?
  6. 非常感谢提前

7 个答案:

答案 0 :(得分:12)

为了真正理解您希望在Polymorphism in general上阅读的virtual关键字:

  

多态性通常被称为第三支柱   面向对象的编程,在封装和继承之后。   多态性是一个希腊词,意思是“多形”,它有两个   不同方面:

     
      
  1. 在运行时,派生类的对象可以被视为a的对象   基类,如方法参数和集合或   阵列。发生这种情况时,不再声明对象的声明类型   与其运行时类型相同。

  2.   
  3. 基类可以定义和实现虚拟方法,并派生   类可以覆盖它们,这意味着它们提供自己的   定义和实施。在运行时,当客户端代码调用时   方法,CLR查找对象的运行时类型,并调用   覆盖虚方法。因此,在您的源代码中,您可以   在基类上调用一个方法,并导致派生类的版本   要执行的方法。

  4.   

一旦您更好地理解了这些概念,您就可以确定您从书中创建的方法是否需要virtual

答案 1 :(得分:6)

  

有人可以向我解释一下:

  1. 在此特定背景下“虚拟”一词的目的

    其他用户在这里得到了很好的参考答案。

  2. 是否需要使用'虚拟'?

    这取决于。有时它是必要的,有时它是多余的。

  3. 为什么有些人使用'虚拟'而其他人没有?

    他们在需要时使用它,或者当他们认为可能需要它时使用它。

  4. 为什么有些人在定义外键时只使用'virtual'?

    在定义由Entity Framework和NHibernate等对象关系映射工具使用的外键时,virtual通常是必需的,因为这些ORM工具会动态创建一个继承自您的类的新类。这些“动态代理”类覆盖您的virtual属性,以提供维护外键一致性所需的其他行为。在NHibernate的情况下,所有属性(不仅仅是外键)必须标记为virtual。这是因为NH动态代理添加了自定义行为来决定模型中要从数据库中检索哪些属性,以及哪些属性可以避免加载。

  5. “虚拟”一词的最佳做法是什么?

    当您打算在更多派生类中重写成员(方法或属性)时,请使用它。不要在标记为sealed的类中使用它们。

答案 2 :(得分:4)

好的,所以术语虚拟,基本上意味着“可覆盖”(具有基础实现),但不是抽象(意味着没有原始实现)。

如果您想要某人覆盖您的方法或财产,而不是“隐藏”它,那么'virutal'关键字就是无关紧要的。

所以这一切都适用于继承和多态。派生类可以覆盖虚方法并使其成为自己的实现(甚至可以在该方法中调用基本实现)。通过覆盖,您可以保证将以多态方式调用新方法,而不是基本实现。

反之,使用'new'关键字,您可以“隐藏”数据成员和方法。这将允许您自己执行,但不会以多态方式执行新实现,它将使用基类实现。

Virual Keyword

Versioning with the Override and New Keywords (C# Programming Guide)

答案 3 :(得分:4)

他在模型中使用虚拟关键字的原因是启用Change Tracking proxies。这是Entity Framework特有的东西(编辑:也是NHibernate,可能还有其他任何一个感谢@danludwig),它允许EF自动管理你映射到数据库的实体。

来自MSDN:

  

映射到实体类型的属性的每个属性   数据模型必须具有非密封(在Visual Basic中为NotOverridable),   获取和设置public和virtual(在Visual Basic中为Overridable)   访问器。

答案 4 :(得分:1)

参见virtual (C# Reference) 。添加virtual关键字允许在派生类中重写属性,这很可能是在构建MVC应用程序的通用基类时。

答案 5 :(得分:0)

来自docs

  

virtual关键字用于修改方法,属性,索引器或   事件声明,并允许在派生类中重写它。

因此,如果您需要隐藏旧功能并添加新功能,则可以使用虚拟功能。根据开发新模块和架构,不同的应用程序需要差异化的需求。

http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

答案 6 :(得分:0)

Virtual确保继承的子类通过强制它们覆盖属性来覆盖基类。如果没有虚拟关键字,子对象就无法覆盖基本功能。