【问题标题】:C# - when to use public int virtual, and when to just use public intC# - 何时使用 public int virtual,何时只使用 public int
【发布时间】:2012-10-01 18:24:25
【问题描述】:

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

我正在创建 CS 类以首先使用 EF 代码对数据进行建模。

所有书中的例子,public virtual int property {get; set; }使用,不做解释。虚拟一词无处不在。

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

谁能给我解释一下:

  1. “虚拟”一词在此特定上下文中的用途
  2. 是否需要使用“虚拟”?
  3. 为什么有些人使用“虚拟”而其他人不使用?
  4. 为什么有些人在定义外键时只使用“虚拟”?
  5. “虚拟”一词的最佳做法是什么?

在此先感谢

【问题讨论】:

  • 不知道虚函数和虚属性是一回事???
  • 重要的是 virtual 关键字 :-) 不管是函数还是属性,如果它没有被标记为虚拟,那么除非后代使用 new 关键字,否则他们必须采用基类中定义的实现。想象一下,你有一个名为 person 的类,有一个名为“Name”的属性。如果您没有将其标记为虚拟属性,则 Person 的所有后代默认情况下都会将该属性作为其名称。如果您将其设为虚拟(或使用 new 关键字),您可以用更具体的实现覆盖(或在 new 的情况下替换)该实现。
  • 我不知道这本书,但请检查 virtual 关键字是否未用于单元测试的模拟目的。

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


【解决方案1】:

为了真正理解 virtual 关键字,您需要阅读 Polymorphism in general

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

  1. 在运行时,派生类的对象可能被视为 方法参数和集合等位置的基类或 数组。发生这种情况时,对象的声明类型不再是 与其运行时类型相同。

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

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

【讨论】:

    【解决方案2】:

    谁能给我解释一下:

    1. “虚拟”一词在此特定上下文中的用途

      这里的其他用户很好地回答了这个问题,并提供了很好的参考。

    2. 有必要使用“虚拟”吗?

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

    3. 为什么有些人使用“虚拟”而其他人不使用?

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

    4. 为什么有些人在定义外键时只使用“虚拟”?

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

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

      当您打算在更派生的类中覆盖成员(方法或属性)时使用它。不要在标有sealed 的类中使用它们。

    【讨论】:

      【解决方案3】:

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

      如果您希望有人覆盖您的方法或属性,而不是“隐藏”它,则“虚拟”关键字是必不可少的。

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

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

      Virual Keyword

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

      【讨论】:

        【解决方案4】:

        他在模型中使用 virtual 关键字的原因是为了启用Change Tracking proxies。这是实体框架特有的东西(编辑:还有 NHibernate,可能还有其他任何形式,感谢@danludwig),它允许 EF 自动管理您映射到数据库的实体。

        来自 MSDN:

        映射到实体类型属性的每个属性 数据模型必须是非密封的(在 Visual Basic 中为 NotOverridable), 公共和虚拟(在 Visual Basic 中可重写)获取和设置 访问器。

        【讨论】:

        • 您还需要在 NHibernate 中将属性标记为 virtual,因此从技术上讲,它并不特定于 EF。 NHibernate 还使用动态代理来进行 FK 管理和属性急切/延迟加载。
        【解决方案5】:

        virtual (C# Reference) .添加 virtual 关键字允许在派生类中覆盖该属性,这在您构建 MVC 应用程序的通用基类时很可能发生。

        【讨论】:

          【解决方案6】:

          来自文档

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

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2016-06-19
              • 2023-02-22
              • 2014-03-03
              • 1970-01-01
              • 2012-04-28
              • 1970-01-01
              • 2019-06-09
              • 2012-06-29
              • 1970-01-01
              相关资源
              最近更新 更多