其实这里没什么可说哦,c++的语法大同小异。先看一段代码。

class Program {

    public static void Test(int a) {
Console.WriteLine("只有一个参数a=={0}", a);
}
public static void Test(int a, int b = 5) {
Console.WriteLine("有两个参数a=={0},b=={1}", a, b);
}
static void Main() {
Test(5);
Console.ReadLine();
}
}

方法重载,可选参数两种技术一起使用,很难一眼看出最终调用的是那个方法。只有在所有参数(可选参数除外)都恰好有一个实参,而且该参数具有兼容类型的情况下,才说一个调用适用于一个方法。虽然这限制了可调用方法的数量,但不足唯一性的表示方法。为了进一步区分方法,编译器只是用调用者显示标识的参数,忽略调用者没有指定的哦可选参数。所以,假如由于一个方法有可选参数,造成两个方法都适用,编译器最终稿选择的是无可选参数的方法。正如这段代码所反映的。

方法解析:

当编译器必须从一系列适用的方法中选择一个最适合某个特定调用方法的时候,会选择拥有最具体的参数类型的那个方法。假如有两个适用的方法。每个要求将实参隐式的转化为形参类型,编译器最终选择的是更具体的派生类型的那个方法的实现。

例如:

假如调用者传递的是一个int,那么接受double的方法将优先于接受object的方法,这是由于double比object更加具体,因为,有不是double的object,但是没有不是object的double,所以double更加具体。

如果有多个适用的方法,但无法从中挑出最具唯一的,编译器就会报错,指明存在二义性。

如下面的这些方法:

static void Method(object thing){};

static void Method (double thing){};

static void Method (long thing){};

static viod Method(int thing){};

调用method(42)会被解析成为int,因为存在着一个从实参类型到新参类型完全匹配的方法,如果删除该方法,那么重载解析会选择long版本,因为long比double和object更加具体的版本。

c#规范包含额外的规则来决定byte,ushort,uint,ulong和其他数值类型之间的隐士转换,但在写程序的时候,最好是使用显示转型,以方便别人理解你想调用哪个目标方法。

命名参数

class Program {
public static void Test(int a, int b) {
Console.WriteLine("a=={0},b={1}", a, b);
}
static void Main() {
Test(b: 5, a: 3);
Console.ReadLine();
}
}

命名参数对于含有可选参数的方法是极大的便利。

但是牺牲了接口的灵活性,要将参数名视为API的一部分,如果API之间的版本兼容性很重要,就要避免更改参数名。

c#方法重载,可选参数,命名参数。的更多相关文章

  1. C# 可选参数 命名参数

    1.可选参数 可选参数是.NET4中新添加的功能,应用可选参数的方法在被调用的时可以选择性的添加需要的参数,而不需要的参数由参数默认值取代. class Program { /// <summa ...

  2. Dart 知识点:位置参数(必选)、位置参数(可选)、命名参数(都是可选)

    先后顺序:位置参数(必选).位置参数(可选).命名参数(都是可选) 位置参数(可选).命名参数(都是可选),不能同时使用

  3. mybatis3.1-[topic-18-20]-_映射文件_参数处理_单个参数&多个参数&命名参数 _POJO&Map&TO 三种方式及举例

    笔记要点出错分析与总结 /**MyBatis_映射文件_参数处理_单个参数&多个参数&命名参数 * _POJO&Map&TO 三种方式及举例 _ * 单个参数 : #{ ...

  4. C#4.0新特性:可选参数,命名参数,Dynamic

    1.可选参数 可以为方法的参数设置一个默认值,如下: class Program { static void Main(string[] args) { Show(); Show("cary ...

  5. c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

       一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会 ...

  6. C# 4.0 新特性dynamic、可选参数、命名参数等

    1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 :   1 var t = new Object(); 2 t.Abc = ‘something’; 3 t.Valu ...

  7. 有关 C# 命名参数和可选参数

    有关 C# 命名参数和可选参数 #1.命名参数: 所谓“命名参数 ( Named Arguments )”,是指方法中定义了一些“有名字”的参数. 给方法参数命名之后,在调用方法时就可以直接根据参数名 ...

  8. c#中的可选参数和命名参数的使用

    C#4.0之后出现了一个可选参数这个特性. class Cal { static void Main(string[] args) { test1 t = new test1(); t.Add(, ) ...

  9. [C#]Attribute特性(2)——方法的特性及特性参数

    上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...

  10. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

随机推荐

  1. android wifi ANR问题分析总结

    android wifi ANR问题分析总结 1 看看main进程阻塞在那里? 2 调用关系的函数阻塞在那里? 3 最终阻塞函数的阻塞前的log以及状态

  2. gulp实用插件总结

    gulp-sass:预编译sass; gulp-imagemin:压缩png.jpj.git.svg格式图片 gulp-minfy-css:压缩css文件 gulp-rename 重命名文件,把一个文 ...

  3. 利用html5 canvas实现纯前端上传图片的裁剪

    今天跟大家分享一个前端裁剪图片的方法.许多网站都有设置用户头像的功能,用户可以选择一张本地的图片,然后用网站的裁剪工具进行裁剪,然后设置大小,位置合适的头像.当然,网上也有一些用js写的诸如此类裁剪的 ...

  4. wrHDL编译中软核代码初始化及编译耗时长的问题

    问题的提出整个WR的ISE工程比较大,编译时间很长,导致开发效率低.通过分析发现,ISE在综合的时候大量的时间都花在了初始化DPRAM上.调研发现Xilinx提供了BMM文件和DATA2MEM工具,可 ...

  5. PPC MPC85xx e500学习笔记

    powerpc的内存体系结构 E500内核中包含内存管理单元MMU,其包含两个查找表(TLB0 Transaction Lookside Buffer)和TLB1来实现虚拟地址和物理地址的转化,其中T ...

  6. 单用户模式下修改root密码

    1.重启或者开机时,在倒数3秒的界面按下任意键. 2.该界面有如下提示(e 编辑 a 更改内核选项 c 命令行  b 启动),所以我们按下"e"编辑. 3.上下键选中第二行再按下& ...

  7. opencl初体验

    总结一下,opencl的步骤差不多是这些 先要获取平台的id clGetPlatformIDs(nPlatforms, platform_id, &num_of_platforms) 然后获取 ...

  8. 更改apache网站根目录导致localhost不能访问

    使用xampp或wamp安装完集成环境后,更改apache的网站根目录会导致localhost,localhost/phpmyadmin访问不到. 解决方法: 打开apache的配置文件:“../ap ...

  9. 解决VS2008 开发Windows Mobile 项目生成速度慢的问题(转)

    最近用VS2008开发Windows Mobile程序,使用C#..NET Compact Framework,发现项目生成速度比较慢.用VS2008打开项目后,开始一段时间生成速度还能忍受,时间一长 ...

  10. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...