起因

写这一篇的起因是想要通过新增默认参数来代替以前的方法,结果发现尽管在调用时写起来一样,实际上也没有被当做同样的方法,两个方法大致如下:

// 先前的方法-删除
private static string TestMethod(string first)
{
return first;
} // 新增的同名方法
private static string TestMethod(string first, string second = "2")
{
return second;
}

上述两种方法都可以通过 TestMethod("1"); 调用,所以最开始误以为两个方法的调用是等价的,但是实际使用中通过DLL引用的方式会提示找不到方法,这里就出现了问题。

首先我们可以进行一个尝试,会发现这两个方法可以同时存在,还是上面的例子,这时再通过 TestMethod("1"); 调用会发现返回的结果是“1”,也就是第一个没有默认参数的方法

到这里为止,暂时还不太清楚原理,但是可以感觉到调用时程序中的写法可能是区别的,这时候我们可以再深入一点,通过中间语言IL(Intermediate Language)的角度去看一下

ILSpy

借助一个简单的例子,先用常用的反编译工具看一下

static void Main(string[] args)
{
Console.WriteLine(TestMethod("1"));
Console.ReadKey(); TestMethodWithDefaultParam(string.Empty);
} private static string TestMethod(string first)
{
return first;
} private static string TestMethod(string first, string second = "2")
{
return second;
} private static void TestMethodWithDefaultParam(string first, string second = "2")
{ }

把编译的好的程序放到ILSpy里面反编译看下

重点对比看下 TestMethodWithDefaultParam 这个方法的调用,可以发现虽然我们没有传入第二个参数,但是由于默认参数的存在,编译器自动帮我们补上了一个参数,而 TestMethod 方法则明显是调用第一个没有默认参数的,有默认参数的 TestMethod 方法被忽略了

ildasm

通过ILSpy我们简单的看到调用时两个方法的区别,但是默认参数的实现情况我们还不是很清楚,所以可以再通过VisualStudio自带的IL反汇编程序ildasm看一下,使用VS的命令行工具输入 ildasm 打开程序,然后打开我们的控制台程序的exe文件

通过这个目录我们可以明确的看到,两个TestMethod方法的参数形式,默认参数的方式只是让我们在调用的时候可以省略参数,而在程序中这个方法仍然具有这个参数,当两个同名的方法一起存在是就相当于方法的重载,调用时传入对应的参数即调用对应的方法

这时我们打开有默认参数的方法,可以看到在IL的形式下,默认参数前面有个[opt]的标识,代表着Optional,即“可选的”,这是C#的一个特性标签——OptionalAttribute,通过OptionalAttribute和DefaultParameterValueAttribute这两个特性也就实现了C#的默认参数,这方面已经有相关的博文,可以参考谈谈C# 4.0新特性“缺省参数”的实现

C#默认参数原理探究的更多相关文章

  1. 【转】Python函数默认参数陷阱

    [转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...

  2. Python面试题目之Python函数默认参数陷阱

    请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_l ...

  3. 弱类型变量原理探究(转载 http://www.csdn.net/article/2014-09-15/2821685-exploring-of-the-php)

    N首页> 云计算 [问底]王帅:深入PHP内核(一)——弱类型变量原理探究 发表于2014-09-19 09:00| 13055次阅读| 来源CSDN| 36 条评论| 作者王帅 问底PHP王帅 ...

  4. SpringBoot:运行原理探究

    西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringBoot ...

  5. ThreadPoolExcutor 原理探究

    概论 线程池(英语:thread pool):一种线程使用模式.线程过多会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务.这避免了在处理短时间 ...

  6. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  7. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  8. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  9. nmap参数原理抓包分析

    nmap参数原理抓包分析 实验环境: Nmap7.70 实验步骤: 1.主机发现 2.端口扫描 3.服务版本探测 一.主机发现 主机发现,如果主机活跃,扫描1000个常用的tcp端口 1.Nmap i ...

随机推荐

  1. JVM基础系列开篇:为什么要学虚拟机?

    跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...

  2. 【Docker】(6)---Dockerfile文件

    springboot项目打包镜像中的Dockerfile文件 在讲Dockerfile文件之前应该先讲下maven的一个插件叫:dockerfile-maven-plugin.他们是组合一起用的 一. ...

  3. java代码之美(7)---guava之Bimap

    guava之Bimap bimap的作用很清晰:它是一个一一映射,可以通过key得到value,也可以通过value得到key. 一.概述 1.bimap和普通HashMap区别 (1)在Java集合 ...

  4. HUSTOJ:Transit Tree Path

    问题 D: Transit Tree Path   You are given a tree with N vertices.Here, a tree is a kind of graph, and ...

  5. Jvm垃圾回收器(基础篇)

    一:概述 在这篇文章中<Jvm运行时数据区>介绍了Java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈,3个区域随着线程的生存而生存的.内存分配和回收都是确定的.随着线程 ...

  6. tmux的详细讲解

    1. tmux介绍 tmux是一个优秀的终端复用软件,split窗口.可以在一个terminal下打开多个终端. 即使非正常掉线,也能保证当前的任务运行,这一点对于远程SSH访问特别有用,网络不好的情 ...

  7. leetcode — longest-consecutive-sequence

    import java.util.HashSet; import java.util.Set; /** * Source : https://oj.leetcode.com/problems/long ...

  8. JS引擎线程的执行过程的三个阶段(一)

    浏览器首先按顺序加载由<script>标签分割的js代码块,加载js代码块完毕后,立刻进入以下三个阶段,然后再按顺序查找下一个代码块,再继续执行以下三个阶段,无论是外部脚本文件(不异步加载 ...

  9. 第42章 发现(discovery) - Identity Server 4 中文文档(v1.0.0)

    可以在*https://baseaddress/.well-known/openid-configuration*找到发现文档.它包含有关IdentityServer的端点,密钥材料和功能的信息. 默 ...

  10. JSON 数据转换

    JSON概述      JSON(Java Script Object Notation)JS对象符号,通常JSON和XML是二选一的,JSON的数据格式很类似于JavaScript的对象 { &qu ...