非虚实例方法继承是如何解决的?

2024-05-12

通过 C# 从 CLR 引用,它读起来就像call将在运行时通过 CLR 搜索由基类型定义的方法。

Then callIL指令用于调用实例或虚拟 方法中,您必须指定一个引用对象的变量。方式 变量本身的类型指示定义该方法的类型 CLR 应该调用。如果变量的类型没有定义方法, 检查基本类型是否有匹配的方法。

and

当调用非虚实例方法时,JIT会定位类型 与用于创建的变量的类型相对应的对象 的电话。如果类型没有定义被调用的方法,JIT 沿着类层次结构向 Object 走去寻找此方法。 它可以做到这一点,因为每个类型对象都有一个引用的字段 为其基本类型。然后,JIT 在类型对象的条目中定位该条目 引用被调用方法的方法表。

但是,根据以下示例,似乎在编译时检查方法继承:

class A
{
    public void Foo() {}
}
class B : A {}
void Main()
{
    new B().Foo();
}
IL_0000:  newobj      UserQuery+B..ctor
IL_0005:  call        UserQuery+A.Foo // Not B.Foo, resolved by C# complier.

我对么?

即使我这样做:

void Main()
{
    B x = new B();
    x.Foo();
}
IL_0000:  newobj      UserQuery+B..ctor
IL_0005:  stloc.0     // x
IL_0006:  ldloc.0     // x
IL_0007:  callvirt    UserQuery+A.Foo // Not B.Foo, resolved by C# complier.

Update:

现在我明白分辨率是静态的。

而且我相信 JIT 需要的变量类型实际上是元数据标记指定的类。

重复警报

实际上它是重复的Richter 在描述非虚拟方法调用的内部结构时是否有误? https://stackoverflow.com/questions/4909373/is-richter-mistaken-when-describing-the-internals-of-a-non-virtual-method-call?rq=1

很高兴还有一个人和我有同样的问题。


引用的内容谈到了变量的类型,不属于变量引用的对象实例的类型。变量类型是静态已知的,因此所有决策都是静态的。

C# 编译器解析要调用的确切方法并将其编码到 IL 中。如果引用的程序集没有更改,则 JIT 本身不必执行任何方法解析。 C# 编译器这样做是因为它想要应用 C# 语义,而不是 CLR 语义。

要回答您编辑的问题:

  1. JIT 无法查看任何对象引用,因为它需要静态决定。它查看堆栈上元素的类型,无论该元素来自何处。在可验证的代码中,这是明确的。不过,变量类型不会影响方法绑定(IOW,你的问题 1 是不相关的)。
  2. 是的,方法是通过程序集+类型+方法名称和签名(包括)引用的。返回类型。非常精确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非虚实例方法继承是如何解决的? 的相关文章

  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 机架超时:关闭信息/活动日志记录

    随着机架超时 https github com heroku rack timeoutgem 安装后如何才能仅显示 ERROR 相关日志 例如 我想避免在我的日志中出现以下内容 source rack timeout id 8a11a8ac
  • WinError6 句柄无效 Python 3+ 多处理

    我正在运行一个 Python 3 7 Flask 应用程序 它使用flask socketio设置一个socketio用于浏览器客户端的服务器 另一个连接到单独远程的Python进程socketio服务器和交换消息 以及另一个从 PIR 传
  • JSF:不同验证器标签的不同验证消息?

    在我的 JSF Primefaces 应用程序中 我正在使用 JSF 验证器标签来验证文本框的输入
  • 在Pytorch中计算欧几里得范数..理解和实现上的麻烦

    我见过另一个 StackOverflow 线程讨论计算欧几里德范数的各种实现 但我很难理解特定实现的原因 如何工作 该代码可以在 MMD 指标的实现中找到 https github com josipd torch two sample b
  • ViewPager 开关 FragmentPagerAdapter

    我有一个ViewPager这是由一个FragmentPagerAdapter 我想将第一个适配器更换为另外两个 问题是之前加载的所有页面 同时具有第一个适配器 仍然是旧的页面 我查看了源代码FragmentPagerAdapter并猜测问题
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 将 Spring MVC 中的默认/全局日期格式设置为 ISO 8601

    我有一个简单的 Spring 控制器 RequestMapping value method RequestMethod GET public void search MyDTO dto And MyDTO public class MyD
  • 未找到行魔术函数“%%time”

    运行这个Python脚本 time train data dt fread input prediction train csv to pandas 提供的输出返回此错误 UsageError Line magic function tim
  • 如何覆盖运行时创建的 wpf 控件中的应用程序样式

    我试图在运行时创建一个 WPF 控件 但我不知道如何让它忽略来自 App xml 资源的样式 我尝试将样式设置为 null 并将 OverridesDefaultStyle 设置为 true 但没有成功 应用程序设置将前景设置为白色 我似乎
  • Azure 媒体服务仅限音频

    我们已开始使用 Azure 媒体服务 AMS 来编码 加密和托管我们的视频 MP4 效果良好 然而 除了视频之外 我们还有 MP3 音频文件 由于我们已经在使用 AMS 因此将它们放在这里也是有意义的 但我们遇到了问题 当我们尝试从门户进行
  • 如何在SQLite中的两个表之间复制数据?

    我有两个具有不同列的表 如下所示 table1 id title name number address table2 id phone name address 如何将数据 名称 地址 从表 1 复制到表 2 我的问题有两种情况 第一 t
  • 如何使用 Passport-saml 向 TestShib IdP 提供 SP 元数据?

    我有一个node js脚本 使用护照 saml https www npmjs com package passport saml 模拟 SP 我的目标是将其连接到此TestShib IdP https idp testshib org i
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • R testthat 单元测试数据和辅助函数约定

    我正在编写一个 R 包 并使用 testthat 进行单元测试 我的许多单元测试都是为了测试适用于我的包特定对象的功能 对于这些测试 我创建了一个辅助函数来设置模拟对象 我还有一些其他辅助函数来减少单元测试中的代码量 目前这些辅助函数在我的
  • Salesforce 返回“unsupported_grant_type”

    我们使用 Web 服务器身份验证流程实现了 OAuth 2 0 十月 十一月时运行良好 但突然停止运行 每当我们尝试授权另一个客户端时 服务器都会返回 400 Bad Request 和正文 error unsupported grant
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • Python,Bokeh:如何更改日期时间轴的范围

    我想使用按钮设置日期时间轴的范围 然而 该命令 f x range Range1d start start date end end date 不起作用 单击按钮时没有任何反应 无论是在运行 Bokeh 服务器的终端窗口中 还是在 Chro
  • 如何检测CSRF漏洞[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一个网站 如何检测潜在的 CSRF 漏洞 提前致谢 这是一个CSRF https www owasp org index php
  • Numpy 的结构化数组与 xarray (xray) 有什么区别?

    有什么区别Numpy 结构化数组命名字段 https docs scipy org doc numpy 1 16 1 user basics rec html vs xarray http xarray pydata org en stab
  • 非虚实例方法继承是如何解决的?

    通过 C 从 CLR 引用 它读起来就像call将在运行时通过 CLR 搜索由基类型定义的方法 Then callIL指令用于调用实例或虚拟 方法中 您必须指定一个引用对象的变量 方式 变量本身的类型指示定义该方法的类型 CLR 应该调用