关于ASP.NET MVC:C-何时使用public int virtual,何时仅使用public int

C# - when to use public int virtual, and when to just use public int

我正在学习J Galloway的"专业ASP.NET MVC 3"教程。在本教程中,Jon向我们展示了如何构建MVC音乐商店。

我现在正在创建CS类,首先使用EF代码对数据建模。

我在书中的所有例子中,使用public virtual int property {get; set; }没有任何解释。虚拟这个词到处都是。

在网络的其他地方,我没有看到虚拟这个词与任何形式的简洁性一起使用。

有人能给我解释一下吗:

  • "虚拟"一词在此特定上下文中的用途
  • 是否需要使用"虚拟"?
  • 为什么有些人使用"虚拟"而另一些人不使用?
  • 为什么有些人在定义外键时只使用"virtual"?
  • "虚拟"一词的最佳实践用法是什么?
  • 提前多谢


    为了真正理解virtual关键字,您一般需要了解多态性:

    Polymorphism is often referred to as the third pillar of
    object-oriented programming, after encapsulation and inheritance.
    Polymorphism is a Greek word that means"many-shaped" and it has two
    distinct aspects:

  • At run time, objects of a derived class may be treated as objects of a
    base class in places such as method parameters and collections or
    arrays. When this occurs, the object's declared type is no longer
    identical to its run-time type.

  • Base classes may define and implement virtual methods, and derived
    classes can override them, which means they provide their own
    definition and implementation. At run-time, when client code calls the
    method, the CLR looks up the run-time type of the object, and invokes
    that override of the virtual method. Thus in your source code you can
    call a method on a base class, and cause a derived class's version of
    the method to be executed.

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


    Could anybody explain to me:

  • "虚拟"一词在此特定上下文中的用途

    这里的其他用户用非常好的参考资料回答了这个问题。

  • 是否需要使用"虚拟"?

    这要看情况而定。有时是必要的,有时是多余的。

  • 为什么有些人使用"虚拟"而另一些人不使用?

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

  • 为什么有些人在定义外键时只使用"virtual"?

    当定义对象关系映射工具(如实体框架和nHibernate)使用的外键时,virtual通常是必要的,因为这些ORM工具动态地创建一个从类继承的新类。这些"动态代理"类重写您的virtual属性,以提供维护外键一致性所需的额外行为。对于NHibernate,所有属性(不仅仅是外键)都必须标记为virtual。这是因为NH动态代理添加了自定义行为来决定从数据库中检索模型上的哪些属性,以及避免加载哪些属性。

  • "虚拟"一词的最佳实践用法是什么?

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


  • 他在模型中使用虚拟关键字的原因是启用更改跟踪代理。这是实体框架特有的功能(edit:anhibernate,可能还有其他ORM,谢谢@danludwig),它允许ef自动管理映射到数据库的实体。

    来自MSDN:

    Each property that is mapped to a property of an entity type in the
    data model must have non-sealed (NotOverridable in Visual Basic),
    public, and virtual (Overridable in Visual Basic) get and set
    accessors.


    因此,术语virtual基本上是指"可重写"(具有基本实现),而不是抽象的(意味着没有原始实现)。

    如果您希望有人重写您的方法或属性,而不是"hide",则"virutal"关键字是nessary。

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

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

    虚拟关键词

    使用覆盖和新关键字进行版本控制(C编程指南)


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


    virtual确保继承的子类通过强制它们重写属性来重写基类。如果没有虚拟关键字,子对象就不能重写基本功能。


    来自DOCS

    The virtual keyword is used to modify a method, property, indexer or
    event declaration, and allow it to be overridden in a derived class.

    因此,如果需要隐藏旧功能并添加新功能,可以使用虚拟功能。根据开发新的模块和体系结构,不同的应用需要不同的需求。

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