一. C# 原始代码和直接结果

测试 C# 代码:

class Program
{
static void Main(string[] args)
{
A c1 = new C();
c1.Foo(); C c2 = new C();
c2.Foo(); Console.ReadKey();
}
}
class A
{
public virtual void Foo()
{
Console.WriteLine("Call on A.Foo()");
}
}
class B : A
{
public override void Foo()
{
Console.WriteLine("Call on B.Foo()");
}
}
class C : B
{
public new void Foo()
{
Console.WriteLine("Call on C.Foo()");
}
}

运行结果:

二. IL程序编译的IL代码执行结果

IL 代码:

.assembly extern mscorlib
{
auto
}
.assembly MyTest{}
.module MyTest.exe .class public A
{
.method public specialname void .ctor()
{
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
} .method public newslot virtual void Foo()
{
ldstr "Call on A.Foo()"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.class public B extends A
{
.method public specialname void .ctor()
{
ldarg.0
call instance void A::.ctor()
ret
} .method public virtual void Foo()
{
ldstr "Call on B.Foo()"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.class public C extends B
{
.method public specialname void .ctor()
{
ldarg.0
call instance void B::.ctor()
ret
} .method public void Foo()
{
ldstr "Call on C.Foo()"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.method public static void Main()
{
.entrypoint
.locals (class A v_0,class C v_1)
newobj instance void C::.ctor()
stloc.0
ldloc.0
callvirt instance void A::Foo()
newobj instance void C::.ctor()
stloc.1
ldloc.1
callvirt instance void C::Foo()
call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
pop
ret
}

运行结果:

三. 用 Call 代替 CallVirt 的 IL

IL 代码:

.assembly extern mscorlib
{
auto
}
.assembly MyTest{}
.module MyTest.exe .class public A
{
.method public specialname void .ctor()
{
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
} .method public newslot virtual void Foo()
{
ldstr "Call on A.Foo()"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.class public B extends A
{
.method public specialname void .ctor()
{
ldarg.0
call instance void A::.ctor()
ret
} .method public virtual void Foo()
{
ldstr "Call on B.Foo()"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.class public C extends B
{
.method public specialname void .ctor()
{
ldarg.0
call instance void B::.ctor()
ret
} .method public void Foo()
{
ldstr "Call on C.Foo()"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.method public static void Main()
{
.entrypoint
.locals (class A v_0,class C v_1)
newobj instance void C::.ctor()
stloc.0
ldloc.0
call instance void A::Foo()
newobj instance void C::.ctor()
stloc.1
ldloc.1
call instance void C::Foo()
call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
pop
ret
}

运行结果:

四. 结论

如果使用 Call 的话,它会简单粗暴的指针调用代码,即 A 中的 Foo 方法的代码进行执行。

C#用Call代替CallVirt之后的测试用例的更多相关文章

  1. TFS 测试用例步骤数据统计

    TFS系统集成了一套BI系统,基于SQL Server的Analysis Service进行实现的.通过这几年的深入使用,能够感触到这个数据数据仓库模型是多么的优秀,和微软官方提供的数据仓库示例Adv ...

  2. 如何使用RobotFramework编写好的测试用例

    如何使用Robot Framework编写优秀的测试用例 概述 命名 测试套件命名 测试用例命名 关键字命名 setup和teardown的命名 文档 测试套件文档 测试用例文档 用户关键字文档 测试 ...

  3. Vertica 导出数据测试用例

    需求:构建简单的测试用例,完成演示Vertica导出数据的功能. 测试用例:导出test业务用户t_jingyu表中的数据. 一.初始化测试环境 二.导出数据 2.1 vsql命令说明帮助 2.2 导 ...

  4. 用CIL写程序:从“call vs callvirt”看方法调用

    前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...

  5. Appium简单测试用例

    工程目录如下: 封装初始化androiddriver 方法 import org.openqa.selenium.remote.DesiredCapabilities; import java.io. ...

  6. qunit 前端脚本测试用例

    首先引用qunit 测试框架文件 <link rel="stylesheet" href="qunit-1.22.0.css"> <scrip ...

  7. .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...

  8. web安全性测试用例

    建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 1.   输入验证 客户端验证 服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,29 ...

  9. Web测试的常用测试用例与知识

    1. Web测试中关于登录的测试 2. 搜索功能测试用例设计 3. 翻页功能测试用例 4. 输入框的测试 5. Web测试的常用的检查点 6. 用户及权限管理功能常规测试方法 7. Web测试之兼容性 ...

随机推荐

  1. python中list的运算,操作及实例

    在操作list的时候,经常用到对列表的操作运算,比如说,列表添加,删除操作,其实,这里面经常回遇到这样一个问题,就是列表的操作容易被混淆了. 有人做了一个总结,这个很清晰,我就不多做阐述了: 1.ap ...

  2. SpringBoot+JWT+Shiro+MybatisPlus实现Restful快速开发后端脚手架

    一.背景 前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础.SpringBoot使编码配置部署都变得简单,越来越多的互联网公司已经选择SpringBoot作为微服务的入门级微框 ...

  3. SSHD

    SSH基本概述 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Group )制定在进行数据传输之前,S ...

  4. DEBUG 命令用法

    (2)DEBUG 命令用法 进入 DEBUG ,用 D 命令查看数据段中 0100H——0200H 单元的内容 用 U 命令查看代码段中 0100H 开始的程序 用 R 命令查看并修改 IP 寄存器的 ...

  5. strlen函数 (求字符串长度函数)

    strlen函数原型在<string.h>中 #include <stdio.h> #include <string.h> int main(){ char *p= ...

  6. python __iter__和__getitem__区别

    __getitem__ 单独实现这个魔法函数,可以让这个类成为一个可迭代的对象,并且可以通过使用下标获取类中元素值下标的元素 class Library(object): def __init__(s ...

  7. Java中间消息件——ActiveMQ入门级运用

    先来说一说我们为什么要用这个东西啊! 比如,我们现在有这样了个问题要解决: 这样,我们就要用到中间消息间了 然后我们就说一下什么是中间消息间吧. 采用消息传送机制/消息队列 的中间件技术,进行数据交流 ...

  8. Swoole中内置Http服务器

    创建httpServer.php文件,代码如下: <?php // 创建服务对象 $http = new swoole_http_server("10.211.55.17", ...

  9. CronExpression表达式详解和案例

    1. cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 2. cron表达式各占位符解释: {秒数} ==> 允许值范围: 0~59 ,不允许 ...

  10. Promise的使用

    Promise的简单认识 Promise 是ES6中对异步编程的一种解决方案,可以避免出现回调地狱 Promise最基本的语法 new Promise((resolve, reject) => ...