[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/ 背景 默认情况下,方法参数 ...
随机推荐
- 39. Volume Rendering Techniques
Milan Ikits University of Utah Joe Kniss University of Utah Aaron Lefohn University of California, D ...
- 小兔的棋盘(hdu2067)
小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 写essay和research paper必用的17个网站
1.http://scholar.google.com/ 虽然还是Beta版,但个人已觉得现在已经是很好很强大了,Google学术搜索滤掉了普通搜索结果中大量的垃圾信息,排列出文章的不同版本以及被其它 ...
- SQL的主键和外键约束
SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...
- iOS常用宏 定义
总结了iOS开发过程中的一些常用宏,以后会陆陆续续添加进来. 字符串是否为空 1 #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull c ...
- 通过PowerShell发送TCP请求
很多时候我们需要通过Socket发送特定的TCP请求给服务器的特定端口来实现探测服务器的指定端口所开启的服务.很多语言都有相应的方法实现上述需求,当然,PowerShell也不例外,比如我们要发送一个 ...
- 点击弹出 +1放大效果 -- jQuery插件
20140110更新: <!doctype html> <html> <head> <meta charset="UTF-8"> & ...
- SAP GUI SAPLOGON.INI
GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...
- Unity 之 人物换装
http://www.cnblogs.com/mcwind/archive/2011/02/18/1957453.html 原理 一. SkinedMeshRender:该对象负责网格绘制.主要数据 ...
- 20+功能强大的jQuery/CSS3图片特效插件
以下是分享的20几个不错的图片特效插件,基于jQuery和CSS3. 1.jQuery图片下滑切换播放效果 这是一款基于jQuery的焦点图插件,这款焦点图的特点是有向下滑动的动画效果,滑到底部时,有 ...