c# params 工作原理。
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 工作原理。相关推荐
- Servlet 工作原理解析
2019独角兽企业重金招聘Python工程师标准>>> 从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servle ...
- struts2的核心和工作原理
在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...
- 【Java】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- Servlet 工作原理解析--转载
原文:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/index.html?ca=drs- Web 技术成为当今主流的互联网 Web 应用 ...
- Ajax工作原理和原生JS的ajax封装
前言: 之所以用ajax作为博客的开篇,是因为无论从ajax的出现还是从它的作用上来说,ajax对于前端无疑是意义重大的.甚至可以说,是ajax带来了前端这个行业.当然,历史并不能说明当下,曾经的辉煌 ...
- routing-controllers工作原理解析
routing-controllers简介 routing-controllers是一个基于express/koa的Node.js框架,它提供了非常多的装饰器,可以使开发者以一种"依赖注入& ...
- 一句话木马的工作原理
一句话木马的工作原理:一句话木马分析服务端与客户端. "一句话木马"服务端(是用于本地的html提交脚本木马文件) 就是我们要用来插入到asp文件中的asp语句,(不仅仅是以asp ...
- 超详细 Servlet工作原理解析
Web技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet的工作原理是成为一名合格的 Java Web 技术开发人员的基本 ...
- MVC框架基本工作原理
MVC工作原理 MVC要实现的目标是将软件用户界面和业务逻辑分离以使代码可扩展性.可复用性.可维护性.灵活性加强. Model 模型层,一般对数据的处理,业务逻辑都会放在model进行处理 View ...
最新文章
- ssh免密连接远程服务器
- 微信小程序设置域名、不校验域名
- 小程序离成功还差一个版本
- Java中,我自己定义的某个类,去实现某个接口,是否必须实现该接口的全部抽象方法呢?
- .net:Code First 创建或更新数据库
- 《推荐系统笔记(七)》因子分解机(FM)和它的推广(FFM、DeepFM)
- opencv+Dlib python大眼代码
- 不输 MacType,这些优化思路也能让 Windows 字体细腻清晰
- 计算机上分辨率怎么设置在哪里设置方法,win7分辨率怎么调|win7如何设置分辨率...
- 主流的工业以太网简介及比较(EPA , EtherCAT , Ethernet Powerlink , PROFINET, Ethernet/IP, SERCOS III)
- 小S坐月子的方法,难怪她身材那么好!
- Excel表格无法重命名工作表
- 开发框架-.Net:Learun(力软敏捷开发)
- 2003版excel 删除某列数据相同的行只保留一行的方法
- 程序员书籍PDF大收集
- 小福利,运用python里面的talib模块和cufflinks模块实现stock可视化分析
- IOS navigationController详解
- 【pg Postgres】 Postgres解决Permission denied for relation
- css学习笔记之图像
- 通过ReleaseId创建现有项目的KieContainer的时候,提示Cannot find KieModule