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开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
随机推荐
- php-empty()
$arr = array(array(),array()); 原来empty($arr)值为true哦
- String、String.valueOf、toString 它们三者的区别总结
今天在使用这个的时候发现,他们三者好像在某些场所都是可以用的,但是不免会让人想到那既然它们三者这么的相似,那么总有些什么区别吧.我也在网上找了一些资料看.自己也看了API文档,就将他们三的区别总结一下 ...
- 使用git将代码push到osc上
1.下载git客户端 2.在osc上创建项目 ①使用:git bash here ②在目录下执行:git init ③ssh-keygen -t rsa -C "xqs@gmail.com& ...
- C#使用Timer.Interval指定时间间隔与指定时间执行事件
C#中,Timer是一个定时器,它可以按照指定的时间间隔或者指定的时间执行一个事件. 指定时间间隔是指按特定的时间间隔,如每1分钟.每10分钟.每1个小时等执行指定事件: 指定时间是指每小时的第30分 ...
- 作业七:团队项目——Alpha版本冲刺阶段-11
部分功能实现: public void actionPerformed(ActionEvent ae) { //重新开始按钮 if (ae.getSource().equals(anew)){ int ...
- 为什么我的新项目选择了Quick-cocos2d-x
混Quick社区快一周了,还是决定分享一下我选择Quick的原因. 一是向大家介绍一下我自己,同时也希望给大家提供一个参考首先,向大家介绍一下我自己姓名,年龄,性别这些都不重要了.我是一名程序员,在游 ...
- Java中测试异常的多种方式
使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Web开发人员必读的12个网站
The more you actually create, the more you’ll learn.(创造的越多,学习的越多),世界上有无数个开发人员会在网上分享他们的开发经验,我们无法向所有人学 ...
- 网络异步编程(C#)团购课
新生命开发团队大石头讲解网络异步编程(C#) 内容:网络编程基础.IOCP.APM.SAEA 时长:2~3小时 价格:20元,20人及以上成团,http://item.taobao.com/item. ...
- Redis的使用模式之计数器模式实例
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/123.html?1455853785 Redis 是目前 NoSQL 领域 ...