2019独角兽企业重金招聘Python工程师标准>>>

高级语言之所以成为高级语言,编译器付出了很多。params在给我们带来方便的同时,编译器也是贡献不少。

实例代码:

using System;
public class Test
{   public static void Main(){    Console.WriteLine("结果1");   say("hello","world");Console.WriteLine("结果2");    say("aaaa","sssss","ddddd");Console.ReadKey();}public static void say(string str,string str2) {   Console.WriteLine("single");Console.WriteLine(str);Console.WriteLine(str2);   }public static void say(params string[] str){Console.WriteLine("params");foreach(string s in str)     {Console.WriteLine(s);}}
}

说明下目的,

 say("hello","world");

是为了验证在参数同时适配

public static void say(string str,string str2)
public static void say(params string[] str)

的时候,编译器是调用哪个函数。

  say("aaaa","sssss","ddddd");

是为了察看params的运作过程

代码结果:

分析:

从结果1可看出在同时符合确定变量和可变变量的时候,编译器调用的是确定变量的函数,至于原因等说完params在提。

反编译这段代码。

注意参数,这里并没有出现params字样,说明到这个层级是不存在params了,接着看main函数。

.method public hidebysig static void  Main() cil managed
{.entrypoint// Code size       79 (0x4f).maxstack  3.locals init (string[] V_0)IL_0000:  ldstr      bytearray (D3 7E 9C 67 31 00 )                               // .~.g1.IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)IL_000a:  ldstr      "hello"IL_000f:  ldstr      "world"IL_0014:  call       void Test::say(string,string)                                                       // 结果1的调用IL_0019:  ldstr      bytearray (D3 7E 9C 67 32 00 )                               // .~.g2.IL_001e:  call       void [mscorlib]System.Console::WriteLine(string)IL_0023:  ldc.i4.3IL_0024:  newarr     [mscorlib]System.StringIL_0029:  stloc.0IL_002a:  ldloc.0IL_002b:  ldc.i4.0IL_002c:  ldstr      "aaaa"IL_0031:  stelem.refIL_0032:  ldloc.0IL_0033:  ldc.i4.1IL_0034:  ldstr      "sssss"IL_0039:  stelem.refIL_003a:  ldloc.0IL_003b:  ldc.i4.2IL_003c:  ldstr      "ddddd"IL_0041:  stelem.refIL_0042:  ldloc.0IL_0043:  call       void Test::say(string[])                                       //结果2的调用IL_0048:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()IL_004d:  popIL_004e:  ret
} // end of method Test::Main

从结果1可以清楚地看到调用的是确定参数函数,往下的IL_0024构建了一个数组,然后在一个个的把参数推送进数组,最后调用了say(string[] )函数.

结论: 

params的实现只是将单个的参数打包成数组,,调用数组参数函数,事实上你并不能同时声明,say(string[])和say(params string[]),会提示已存在.在这里也能解释为什么在既可变参,也可定参的情况下使用定参的原因了.使用变参需要额外的代码打包参数.

转载于:https://my.oschina.net/hunjixin/blog/517025

c# params 工作原理。相关推荐

  1. Servlet 工作原理解析

    2019独角兽企业重金招聘Python工程师标准>>> 从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servle ...

  2. struts2的核心和工作原理

    在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...

  3. 【Java】Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

  4. Servlet 工作原理解析--转载

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/index.html?ca=drs- Web 技术成为当今主流的互联网 Web 应用 ...

  5. Ajax工作原理和原生JS的ajax封装

    前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...

  6. routing-controllers工作原理解析

    routing-controllers简介 routing-controllers是一个基于express/koa的Node.js框架,它提供了非常多的装饰器,可以使开发者以一种"依赖注入& ...

  7. 一句话木马的工作原理

    一句话木马的工作原理:一句话木马分析服务端与客户端. "一句话木马"服务端(是用于本地的html提交脚本木马文件) 就是我们要用来插入到asp文件中的asp语句,(不仅仅是以asp ...

  8. 超详细 Servlet工作原理解析

    Web技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet的工作原理是成为一名合格的 Java Web 技术开发人员的基本 ...

  9. MVC框架基本工作原理

    MVC工作原理 MVC要实现的目标是将软件用户界面和业务逻辑分离以使代码可扩展性.可复用性.可维护性.灵活性加强. Model 模型层,一般对数据的处理,业务逻辑都会放在model进行处理 View ...

最新文章

  1. ssh免密连接远程服务器
  2. 微信小程序设置域名、不校验域名
  3. 小程序离成功还差一个版本
  4. Java中,我自己定义的某个类,去实现某个接口,是否必须实现该接口的全部抽象方法呢?
  5. .net:Code First 创建或更新数据库
  6. 《推荐系统笔记(七)》因子分解机(FM)和它的推广(FFM、DeepFM)
  7. opencv+Dlib python大眼代码
  8. 不输 MacType,这些优化思路也能让 Windows 字体细腻清晰
  9. 计算机上分辨率怎么设置在哪里设置方法,win7分辨率怎么调|win7如何设置分辨率...
  10. 主流的工业以太网简介及比较(EPA , EtherCAT , Ethernet Powerlink , PROFINET, Ethernet/IP, SERCOS III)
  11. 小S坐月子的方法,难怪她身材那么好!
  12. Excel表格无法重命名工作表
  13. 开发框架-.Net:Learun(力软敏捷开发)
  14. 2003版excel 删除某列数据相同的行只保留一行的方法
  15. 程序员书籍PDF大收集
  16. 小福利,运用python里面的talib模块和cufflinks模块实现stock可视化分析
  17. IOS navigationController详解
  18. 【pg Postgres】 Postgres解决Permission denied for relation
  19. css学习笔记之图像
  20. 通过ReleaseId创建现有项目的KieContainer的时候,提示Cannot find KieModule

热门文章

  1. 两数的最大公约数算法基础及优化
  2. 计算机的网络功能不包括下面项,计算机网络中,防火墙的功能不包括
  3. 2013_hangzhou_online
  4. msyql 禁止远程访问
  5. php变量使用,php变量的使用
  6. linux 下source命令
  7. 【Java学习笔记七】常用数据对象之数组
  8. Linux系统编程——线程池
  9. 字符串的规范使用(二)
  10. 线程池原理及C语言实现线程池