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

测试 C# 代码:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. A c1 = new C();
  6. c1.Foo();
  7.  
  8. C c2 = new C();
  9. c2.Foo();
  10.  
  11. Console.ReadKey();
  12. }
  13. }
  14. class A
  15. {
  16. public virtual void Foo()
  17. {
  18. Console.WriteLine("Call on A.Foo()");
  19. }
  20. }
  21. class B : A
  22. {
  23. public override void Foo()
  24. {
  25. Console.WriteLine("Call on B.Foo()");
  26. }
  27. }
  28. class C : B
  29. {
  30. public new void Foo()
  31. {
  32. Console.WriteLine("Call on C.Foo()");
  33. }
  34. }

运行结果:

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

IL 代码:

  1. .assembly extern mscorlib
  2. {
  3. auto
  4. }
  5. .assembly MyTest{}
  6. .module MyTest.exe
  7.  
  8. .class public A
  9. {
  10. .method public specialname void .ctor()
  11. {
  12. ldarg.0
  13. call instance void [mscorlib]System.Object::.ctor()
  14. ret
  15. }
  16.  
  17. .method public newslot virtual void Foo()
  18. {
  19. ldstr "Call on A.Foo()"
  20. call void [mscorlib]System.Console::WriteLine(string)
  21. ret
  22. }
  23. }
  24. .class public B extends A
  25. {
  26. .method public specialname void .ctor()
  27. {
  28. ldarg.0
  29. call instance void A::.ctor()
  30. ret
  31. }
  32.  
  33. .method public virtual void Foo()
  34. {
  35. ldstr "Call on B.Foo()"
  36. call void [mscorlib]System.Console::WriteLine(string)
  37. ret
  38. }
  39. }
  40. .class public C extends B
  41. {
  42. .method public specialname void .ctor()
  43. {
  44. ldarg.0
  45. call instance void B::.ctor()
  46. ret
  47. }
  48.  
  49. .method public void Foo()
  50. {
  51. ldstr "Call on C.Foo()"
  52. call void [mscorlib]System.Console::WriteLine(string)
  53. ret
  54. }
  55. }
  56. .method public static void Main()
  57. {
  58. .entrypoint
  59. .locals (class A v_0,class C v_1)
  60. newobj instance void C::.ctor()
  61. stloc.0
  62. ldloc.0
  63. callvirt instance void A::Foo()
  64. newobj instance void C::.ctor()
  65. stloc.1
  66. ldloc.1
  67. callvirt instance void C::Foo()
  68. call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  69. pop
  70. ret
  71. }

运行结果:

三. 用 Call 代替 CallVirt 的 IL

IL 代码:

  1. .assembly extern mscorlib
  2. {
  3. auto
  4. }
  5. .assembly MyTest{}
  6. .module MyTest.exe
  7.  
  8. .class public A
  9. {
  10. .method public specialname void .ctor()
  11. {
  12. ldarg.0
  13. call instance void [mscorlib]System.Object::.ctor()
  14. ret
  15. }
  16.  
  17. .method public newslot virtual void Foo()
  18. {
  19. ldstr "Call on A.Foo()"
  20. call void [mscorlib]System.Console::WriteLine(string)
  21. ret
  22. }
  23. }
  24. .class public B extends A
  25. {
  26. .method public specialname void .ctor()
  27. {
  28. ldarg.0
  29. call instance void A::.ctor()
  30. ret
  31. }
  32.  
  33. .method public virtual void Foo()
  34. {
  35. ldstr "Call on B.Foo()"
  36. call void [mscorlib]System.Console::WriteLine(string)
  37. ret
  38. }
  39. }
  40. .class public C extends B
  41. {
  42. .method public specialname void .ctor()
  43. {
  44. ldarg.0
  45. call instance void B::.ctor()
  46. ret
  47. }
  48.  
  49. .method public void Foo()
  50. {
  51. ldstr "Call on C.Foo()"
  52. call void [mscorlib]System.Console::WriteLine(string)
  53. ret
  54. }
  55. }
  56. .method public static void Main()
  57. {
  58. .entrypoint
  59. .locals (class A v_0,class C v_1)
  60. newobj instance void C::.ctor()
  61. stloc.0
  62. ldloc.0
  63. call instance void A::Foo()
  64. newobj instance void C::.ctor()
  65. stloc.1
  66. ldloc.1
  67. call instance void C::Foo()
  68. call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  69. pop
  70. ret
  71. }

运行结果:

四. 结论

如果使用 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. 你必须知道的Docker数据卷(Volume)

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...

  2. IT兄弟连 HTML5教程 HTML5表单 HTML5新增表单元素

    HTML5有一些新的表单元素:<datalist>.<keygen>.<output>.不是所有的浏览器都支持HTML5新的表单元素,但即使浏览器不支持该表单属性, ...

  3. 从七个方面,面试BAT大厂高级工程师,纯干货!

    转载注明:https://blog.csdn.net/WantFlyDaCheng/article/details/100078782 一.框架是重点,但别让人感觉你只会山寨别人的代码 二.别单纯看单 ...

  4. SSM整合2(springMVC+mybatis)

    客户在浏览器端会提交一些参数到服务器端,比如用户的登录等,就会传username 和 password过来,springmvc则通过参数绑定组件将请求参数的内容进行数据转换,然后将转换后的值覆给con ...

  5. 关于angularjs异步操作后台请求时,用$q.all排列先后顺序的问题

    最近我在做angularjs程序时遇到了一个问题 1.页面有很多选择框,一个选择框里面有众多的选择项,和一个默认选定的项,像下面这样(很多选择框,不只一个): 2.众多的选项要从后台接口得到,默认项从 ...

  6. ArcGIS以数据库作为数据源作为source发布服务步骤详解(以Postgresql为例)及各种发布问题

    创建企业级数据库 Data Management Tools-->Geodatabase Administration-->Create Enterprise Geodatabase 按如 ...

  7. jdbc大略

    一.概述JDBC JDBC从物理结构上说就是Java语言访问数据库的一套接口集合. 从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议. JDBC API: 使得开发人员可以使用纯Jav ...

  8. ActiveMQ持久化到MySQL以及使用SSL协议通讯

    最近公司事情稍微少了点,研究下怎么优化几个系统的交互,因为我们目前使用的是长链接的同步接口,就考虑用下MQ来处理下.由于公司对安全有要求且和CA业务有关,则使用了SSL协议.此文使用的是Activem ...

  9. mybatis foreach方法遍历对象

    <delete id="deleteAppUserByIds">    delete from app_userinfo where     <foreach i ...

  10. 【Java】String的首尾去空和判空

    去除字符串首尾空白字符:包括\t,\r,\n及" ": //去除字符串首尾空白字符:包括\t,\r,\n及" ": System.out.println(&qu ...