c# params 工作原理。

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

高级语言之所以成为高级语言,编译器付出了很多。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的运作过程

代码结果:

120015_4z57_2403989.png

分析:

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

反编译这段代码。

120438_tIU1_2403989.png

注意参数,这里并没有出现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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这7个在线工具,帮助您快速开发WordPress主题

由于WordPress遵从GPL协议,这个协议规定WordPress可以免费用于商业用途。这样做一个网站的成本就比较低。相对应的开发WordPress主题的需求就多起来了。结合笔者多年开发WordPress主题的经验,熟练使用下面一些免费的工具,在开发WordPress主题…

参数依赖查找(ADL,Argument-dependent lookup)

参数依赖查找(Argument-dependent lookup),又称 ADL 或 Koenig 查找,是一组于函数调用表达式查找非限定函数名的规则,包含对重载运算符的隐式函数调用。在通常非限定名称查找所考虑的作用域和命名空间之外,…

让你的WordPress主题支持自定义菜单

WordPress 3以后的版本已经支持自定义菜单功能,如果你的主题还不能支持这个功能话,我敢说你的主题Out啦,是不是想再In进来?那就认真继续阅读,让你的WordPress主题支持自定义菜单功能。 啦,是不是想再In进来…

2016 年 ACM/ICPC 青岛区域赛 Problem C Pocky

昨晚乱入学弟的训练赛&#xff0c;想了一下这个题。推导的过程中&#xff0c;加深了对公理化的概率论理解。$\newcommand{\d}{\mathop{}\!\mathrm{d}}$ 解法一 考虑 $ d < L$ 的情形。 \begin{equation*} P(X 1) \frac{d}{L} \end{equation*} \begin{align*} P(X 2) &…

为什么新来的技术很难接手维护一个系统

为什么开发功能变得越来越慢? 某天来一个技术&#xff0c;他跟老板说&#xff1a;这个系统太臃肿了。很乱&#xff0c;我很难开展工作下去&#xff0c;至少很难按照我的经验和设想来实施。如果想让我顺利干下去&#xff0c;办法就是对系统进行重构一次(重构代码,或者开发新的系…

Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo failed:

原来数据库的配置是这样的 DB_CONNECTIONmysql DB_HOSTlocalhost DB_PORT3306 修改成如下&#xff1a; DB_CONNECTIONmysql DB_HOST127.0.0.1 DB_PORT3306 再次执行OK:

ztree 获取当前选中节点的子节点集合

功能&#xff1a;获取当前选中节点的子节点id集合。 步骤&#xff1a;1.获取当前节点 2.用ztree的方法transformToArray()获取当前选中节点&#xff08;含选中节点&#xff09;的子节点对象集合。 3.遍历集合&#xff0c;取出需要的值。 treeNode&#x…

Project facet Dynamic Web Module version 3.1 is not supported.

修改Web Module version 3.1 is not supported.问题 http://uule.iteye.com/blog/2052680 <host id"localhost" root-directory"${resin.root}/webapps/15newIIMS"> <web-app id"/" document-directory""><path-mappin…

不用第三方插件如何统计自己wordpress的访问量

很多wordpress博主都很在乎自己的访问量&#xff0c;使用第三方统计插件又会拖慢自己博客的响应速度&#xff0c;下面就交给大家如何自己写代码统计自己博客的访问量。 工具/原料 wordpress站点 自己站点的各种权限 方法/步骤 登录自己博客的后台&#xff0c;输入正确的用户…

笔记本安装win7和arch linux双系统+xfce4桌面

参考&#xff1a;Archlinux 2015.07.01 和 Windows7 双系统 安装教程http://www.cnblogs.com/fangying7/p/3803290.html 关于Archlinux 的安装 http://blog.csdn.net/ispeller/article/details/9327389 Archlinux安装和使用技巧 http://www.cnblogs.com/vachester/p/5635819.ht…

该Tiled地图制作拿到项目~~这是偷懒,为了直接复制后写来

1.现在&#xff0c;.h声明private:cocos2d::CCSprite* ninja;cocos2d::CCTMXTiledMap* tileMap; 然后.cpp中增加tileMap CCTMXTiledMap::create("MyTileMap.tmx");CCTMXLayer* backLayer tileMap->layerNamed("Tile Layer 1");CCAssert(backLayer, &…

用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...

最近在看算法&#xff0c;看到这个题&#xff0c;觉得挺经典的&#xff0c;收起。 分析&#xff1a; 1 、把问题归结为图结构的遍历问题。实际上6个数字就是六个结点&#xff0c;把六个结点连接成无向连通图&#xff0c;对于每一个结点求这个图形的遍历路径&#xff0c;所有结点…

WordPress导航菜单函数register_nav_menus() 和 wp_nav_menu()

导航菜单是每一个WordPress主题必须的元素&#xff0c;如果你要制作一个WordPress主题&#xff0c;那就必须熟悉WordPress导航菜单注册函数 register_nav_menus() 和 导航菜单调用函数wp_nav_menu() &#xff0c;这两个参数一般都是配合使用的。今天我们就一起来解释一下这两个…

LeetCode 16 3Sum Closest(最接近的3个数的和)

翻译 给定一个有n个整数的数组S&#xff0c;找出S中3个数&#xff0c;使其和等于一个给定的数&#xff0c;target。返回这3个数的和&#xff0c;你可以假定每个输入都有且只有一个结果。例如&#xff0c;给定S {-1 2 1 -4}&#xff0c;和target 1。那么最接近target的和是2。…

基因重组

1s / 32M 【问题描述】目前,科学家们正致力于对生物基因的重组进行深入研究。基因的物质载体是脱氧核糖核酸(DNA)。DNA 是一种仅由 A、T、G、C 四种基元构成的双螺旋结构的有机分子。DNA 的两条单链上,同一位置的两个基元是互相对应的。A 对 T,G 对 C,因此,我们只需用任意一条链…

Ubuntu下apache2启动、停止、重启、配置

Linux系统为Ubuntu 一、Start Apache 2 Server /启动apache服务 # /etc/init.d/apache2 start or $ sudo /etc/init.d/apache2 start 二、 Restart Apache 2 Server /重启apache服务 # /etc/init.d/apache2 restart or $ sudo /etc/init.d/apache2 restart 三、Stop Apache 2 …

day6笔记

一、上节回顾 list&#xff1a;li [1,2,3,5,a]增加&#xff1a;append&#xff1a;末尾加入追加 insert&#xff1a;插入&#xff0c;在任意位置&#xff0c;insert&#xff08;index,内容&#xff09; extend:迭代着加入&#xff0c;asc ----> ‘a’,‘s’,‘c’ [1,2,3] …

Android手游《》斗地主完整的源代码(支持单机和网络对战)

Android手游《斗地主》完整的源代码&#xff08;支持单机和网络对战&#xff09;下载。一个很不错的源代码。斗地主掌游是一个独特的国内社会斗地主棋牌游戏&#xff0c;之后玩家可以下载网上斗地主和全世界。掌游斗地主特点&#xff1a;1、只有一个主要的社会斗地主棋牌游戏。…

昨天的补给

2014-04-22 09:37 昨天主要改变了之前的布局。采用的是单选按钮。避免逻辑上需要判断。 2014-04-22 09:38 晚上给媳妇买了奶茶和德芙&#xff0c;她很开心。网易订购的项链到了&#xff0c;就是定制的文字多了&#xff0c;不是太好看。 转载于:https://www.cnblogs.com/jsRunne…

jQuery判断当前点击的是第几个li的代码

使用$(this).index()取得li的下标&#xff0c;下面是一个样式替换的例子&#xff1a; $("#aa li").click(function(){ $("#aa li").removeClass("class名字&#xff0c;多个class用空格分开"); $(this).addClass("class名字&#xff0c;多个…