[CLR via C#]9. 参数
一、可选参数和命名参数
在设计一个方法的参数时,可为部分或全部参数分配默认值。然后,调用这些方法的代码时可以选择不指定部分实参,接受默认值。此外,调用方法时,还可以通过指定参数名称的方式为其传递实参。比如:
internal static class Program {
private static Int32 s_n = ;
private static void M(Int32 x=, String s = "A",
DateTime dt = default(DateTime), Guid guid = new Guid()) {
Console.WriteLine("x={0}, s={1}, dt={2}, guid={3}, x, s, dt, guid");
}
public static void Go() {
// 1.等同于: M(9, "A", default(DateTime), new Guid());
M();
// 2. 等同于: M(8, "X", default(DateTime), new Guid());
M(, "X");
// 3. 等同于: M(5, "A", DateTime.Now, Guid.NewGuid());
M(, guid: Guid.NewGuid(), dt: DateTime.Now);
// 4. 等同于: M(0, "1", default(DateTime), new Guid());
M(s_n++, s_n++.ToString());
// 5. 等同于s: String t1 = "2"; Int32 t2 = 3;
// M(t2, t1, default(DateTime), new Guid());
M(s: (s_n++).ToString(), x: s_n++);
}
}
// 方法声明
private static void M(ref Int32 x) { ... }
// 方法调用
Int32 a = ;
M(x: ref a);
.....
二、隐式类型的局部变量
针对一个方法中的隐式类型的局部变量,C#允许根据初始化表达式的类型来判断它的类型。
private static void ImplicitlyTypedLocalVariables() {
var name = "Jeff";
ShowVariableType(name); // 类型是: System.String
// var n = null; // 错误
var x = (Exception)null; // 可以这样写,但没意义
ShowVariableType(x); // 类型是: System.Exception
var numbers = new Int32[] { , , , };
ShowVariableType(numbers); // 类型是: System.Int32[]
// 针对复杂类型,可减少打字量
var collection = new Dictionary<String, Single>() { { ".NET", 4.0f } };
// 类型是: System.Collections.Generic.Dictionary`2[System.String,System.Single]
ShowVariableType(collection);
foreach (var item in collection) {
// 类型是: System.Collections.Generic.KeyValuePair`2[System.String,System.Single]
ShowVariableType(item);
}
}
private static Int32 Add(params Int32[] values) {
Int32 sum = ;
for (Int32 x = ; x < values.Length; x++)
sum += values[x];
return sum;
}
params关键字只能应用于方法参数列表的最后一个参数。
//显示 "15"
Console.WriteLine(Add(new Int32[] { , , , , }));
也可以这样:
// 显示 "15"
Console.WriteLine(Add(, , , , ));
// 显示"0"
Console.WriteLine(Add());
Console.WriteLine(Add(null));
private static void DisplayTypes(params Object[] objects) {
foreach (Object o in objects)
Console.WriteLine(o.GetType());
}
五、参数和返回类型的指导原则
1)声明方法的参数类型时,应尽量指定最弱的类型,最好是接口而不是基类。
//好
public void MainpulateItems<T>(IEnumerable<T> collection) { ... }
//不好
public void MainpulateItems<T>(List<T> collection) { ... } //好:该方法使用弱参数类型
public void ProcessBytes(Stream someStream) { ... }
//不好:该方法使用强参数类型
public void ProcessBytes(FileStream someStream) { ... }
2)一般最好将方法的返回类型声明为最强的类型,以免受限于特定类型。例如:
//好:该方法使用强返回值类型
public FileStream ProcessBytes() { ... }
//不好:该方法使用弱返回值类型
public Stream ProcessBytes() { ... }
六、常量性
CLR没有提供对常量参数/对象的支持。
[CLR via C#]9. 参数的更多相关文章
- 【CLR in c#】参数
1.可选参数和命名参数 设计一个参数时,可为部分或全部参数分配默认值,调用这些方法的代码可以选择不指定部分实参,接受默认值,还可以通过制定参数名称的方式传递实参.如下 class CLR可选参数 { ...
- CLR via C#(10)-参数
一. 命名参数.可选参数 命名参数和可选参数是在Visual C#2010中引入的新特性. 笨地儿我个瓜不兮兮的,今天才知道. 可选参数:定义方法时为参数设置默认值,调用该方法时可以省略为某些形参指定 ...
- CLR via C#深解笔记四 - 方法、参数、属性
实例构造器和类(引用类型) 构造器(constructor)是允许将类型的实例初始化为良好状态的一种特殊方法.构造器方法在“方法定义元数据表”中始终叫.ctor. 创建一个引用类型的实例时: #1, ...
- <NET CLR via c# 第4版>笔记 第9章 参数
9.1 可选参数和命名参数 class Program { private static int s_n = 0; private static void M(int x = 9, string s ...
- CLR via c#读书笔记六:参数
注:书本第9单参数 CLR默认所有方法参数都传值.引用本身是值引的,意味左方法能修改对象,而调用都能看到这些修改.值类型,传的是实例的一个副本,所以调用者不受影响. (和以前理解的不一样.默认都是传值 ...
- 重温CLR(六)方法和参数
实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据 ...
- CLR总览
Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...
- CLR 完全介绍
From: http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx http://msdn.microsoft.com/en-us/magazin ...
- [译]C# 7系列,Part 8: in Parameters in参数
原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数 ...
随机推荐
- xcode 编译器在各个arch下面默认宏
$ clang -dM -E -arch armv7 -x c /dev/null #define OBJC_NEW_PROPERTIES 1 #define __APCS_32__ 1 #defin ...
- 写essay和research paper必用的17个网站
1.http://scholar.google.com/ 虽然还是Beta版,但个人已觉得现在已经是很好很强大了,Google学术搜索滤掉了普通搜索结果中大量的垃圾信息,排列出文章的不同版本以及被其它 ...
- MySQL 服务无法启动。 服务没有报告任何错误。 请键入 NET HELPMSG 3534 以获得更多的帮助。
网上搜了下,看到有几种解决方法,本人综合了一下,作为记录 第一步 有一部分人成功了 在安装根目录创建data文件夹 第二步 有一部分人成功了 D:\Program Files\mysql\bin> ...
- 使用git提交内容到网盘
1.创建版本库(注意勾选纯版本库的选项) 2.客户端获取版本库代码 3.提交及获取 master是git默认的主要分支(主干),适合单人独自开发.多人开发时可以给每个人创建一个分支 参考资料: htt ...
- 结合使用saiku、mondrian workbentch建立多维查询报表
1.简介 前几篇博客已经介绍了saiku.mondrian.MDX和模式文件他们之间的关系,那么如何将它们串联起来,供产品人员使用哪?下面咱们一步一步的实现 2.建立数据表 建表语句参考:http:/ ...
- node-sass 安装卡在 node scripts/install.js 解决办法
转自:https://segmentfault.com/a/1190000005921721 ======== 7月12日更新 ======== 总的来说就是两种方法解决: SASS_BINARY_S ...
- jquery-migrate.js
这个插件可以用来检测和恢复在jQuery1.9版本中已删除或已过时的API.
- 如何在wp8 中调试cocos2dx c++ 代码
有的时候在win32上运行良好的cocos2dx程序移植到wp8的时候就出了问题,我们想把断点放到c++代码中,需要设置一下VS 2012 右击项目属性 把ui任务 设置为仅限本机 即可.
- java之源码路径及api
jav源码地址:D:\Program Files\jdk1.7\src.zip class类地址:D:\Program Files\jdk1.7\jre\lib\rt.jar 在线api底地址:htt ...
- Android之GridView控制显示多少行以及遇到的怪事
前段时间接到一个需求,要求GridView超过两行只显示两行多余的不显示.但是GridView没有设置多少行的api,只有设置多少列的方法,到处查找资料都类似的case,stakeoverfrow上面 ...