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开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
随机推荐
- linux-15基础命令之-用户与用户组(useradd,userdel,usermod,passwd,groupadd)
1.useradd 命令用于创建新的用户,格式为:useradd[选项] 用户名 useradd参数 参数 作用 -d 指定用户的家目录(默认/home/username) -D 展示默认值 -e 帐 ...
- \(\S2. \)The Ornstein-Uhlenbeck operator and its semigroup
Let \(\partial_i =\frac{\partial}{\partial x_i}\). The operator \(\partial_i\) is unbounded on \(L^2 ...
- 管理我的数据之GDBM
管理我的数据之GDBM 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Publi ...
- Linux 网络编程(epoll)
服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/soc ...
- 坑爹的BufferManager
特别记录一下 国内外各种关于 Socket 的例子或开源项目,大部分都采用了 BufferManager.cs(代码类似). 也不知道是哪一个坑货写的.有一定几率会导致内存无法复用,导致数据是上一个的 ...
- Web端导出CSV
前端导出文件大部分还是通过服务器端的方式生成文件,然后传递到客户端.但很多情况下当我们导出CSV时并不需要后端参与,甚至没有后端. 做过WebGIS的同学经常会碰到这种场景,用户的兴趣点数据以csv文 ...
- Spring AOP简述
使用面想对象(Object-Oriented Programming,OOP)包含一些弊端,当需要为多个不具有继承关系的对象引入公共行为时,例如日志,安全检测等.我们只有在每个对象中引入公共行为,这样 ...
- 一个App完成入门篇(二)-搭建主框架
通过第一课的学习,你已经掌握了如何通过debug调试器来跟PC上的设计器联调来实时查看UI设计效果.调试代码了,接下来通过一系列的demo开发教学你将很快上手学习到如何开发一个真正的App. 要开发A ...
- 技术渣如狗,面试虐成猴——本科楼主UC笔试加处女一面全纪录
背景——楼主为广州某校小本一枚,学习成绩渣(班里排名几乎倒数),技术基础渣(算是会敲代码,但很多计算机网络.操作系统的知识都只有模糊的印象).在舍友的鼓励下,收到广州UC的面试通知后,勇敢来到公司直面 ...
- ASP.NET MVC实现仪表程序
1.1.1 摘要 在大多数情况下,我们的Web程序不仅仅需要给用户提供具体数据,在一些情况下,我们还需要给高级的用户或管理者提供数据汇总和分析图表之类的功能. 如果我们不想显示一大堆烦心的数据,希望通 ...