c#方法重载,可选参数,命名参数。
其实这里没什么可说哦,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#方法重载,可选参数,命名参数。的更多相关文章
- C# 可选参数 命名参数
1.可选参数 可选参数是.NET4中新添加的功能,应用可选参数的方法在被调用的时可以选择性的添加需要的参数,而不需要的参数由参数默认值取代. class Program { /// <summa ...
- Dart 知识点:位置参数(必选)、位置参数(可选)、命名参数(都是可选)
先后顺序:位置参数(必选).位置参数(可选).命名参数(都是可选) 位置参数(可选).命名参数(都是可选),不能同时使用
- mybatis3.1-[topic-18-20]-_映射文件_参数处理_单个参数&多个参数&命名参数 _POJO&Map&TO 三种方式及举例
笔记要点出错分析与总结 /**MyBatis_映射文件_参数处理_单个参数&多个参数&命名参数 * _POJO&Map&TO 三种方式及举例 _ * 单个参数 : #{ ...
- C#4.0新特性:可选参数,命名参数,Dynamic
1.可选参数 可以为方法的参数设置一个默认值,如下: class Program { static void Main(string[] args) { Show(); Show("cary ...
- c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)
一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会 ...
- C# 4.0 新特性dynamic、可选参数、命名参数等
1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 : 1 var t = new Object(); 2 t.Abc = ‘something’; 3 t.Valu ...
- 有关 C# 命名参数和可选参数
有关 C# 命名参数和可选参数 #1.命名参数: 所谓“命名参数 ( Named Arguments )”,是指方法中定义了一些“有名字”的参数. 给方法参数命名之后,在调用方法时就可以直接根据参数名 ...
- c#中的可选参数和命名参数的使用
C#4.0之后出现了一个可选参数这个特性. class Cal { static void Main(string[] args) { test1 t = new test1(); t.Add(, ) ...
- [C#]Attribute特性(2)——方法的特性及特性参数
上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
随机推荐
- wangEditor ie9 表单上传图片
wangEditor ie9 表单上传图片 弹框无法消失 var resultText = $.trim(iframeWindow.document.body.innerHTML); result ...
- JAVA学习博客---2015-6
JAVA核心技术卷一第一遍看得差不多了,应该是五月初开始看的,用了两个月的中午时间看完的,一共七百多页,接下来还是需要再看一遍,不懂的还是有很多. JAVA和C++一样是面向对象OOP的语言,不同于命 ...
- Ubuntu 初始化Root账户密码
昨晚新装的Ubuntu12(电脑太烂了),每次都记不住初始化root密码的命令,既然决定开始写自己的园子了,那就在自己的园子里面记一下,方便自己稳固之心 好了,不废话了了 draenei@ubuntu ...
- 建立自己的Visual Studio工程模板
如果你需要经常创建自己的特殊工程的话,那么预先建立自定义的工程模块,可能会让你的工作变得更轻松一些. 实现方法很简单,一共只需要六个步骤: 一. 新建工程 * 这里选用空白的Web工程. 二. 建立必 ...
- [.NET领域驱动设计实战系列]专题六:DDD实践案例:网上书店订单功能的实现
一.引言 上一专题已经为网上书店实现了购物车的功能了,在这一专题中,将继续对网上书店案例进行完善,本专题将对网上书店订单功能的实现进行介绍,现在废话不多说了,让我们来一起看看订单功能是如何实现的吧. ...
- Java IO1:IO和File
IO 大多数的应用程序都要与外部设备进行数据交换,最常见的外部设备包含磁盘和网络.IO就是指应用程序对这些设备的数据输入与输出,Java语言定义了许多类专门负责各种方式的输入.输出,这些类都被放在ja ...
- asp.net core开发环境准备
1.1 安装sdk和运行时 浏览器打开网址https://www.microsoft.com/net/download, 到.Net Core下载页面. 根据操作系统,下载对应的SDK进行安装.安装 ...
- 【T-SQL基础】02.联接查询
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
- leveldb源码学习系列
楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ...
- 走进AngularJs(七) 过滤器(filter)
过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...