[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/ 背景 默认情况下,方法参数 ...
随机推荐
- 【LeetCode】257. Binary Tree Paths
Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...
- openssl 学习之从证书中提取RSA公钥N 和 E
原文链接: http://blog.csdn.net/kkxgx/article/details/19850509 通常数字证书包含很多信息,其中N和E值即我们称为的公钥.如何从PEM 或者DER格式 ...
- Log4Net简单使用
一. Log4net是什么.优点 用来记录程序日志,优点:1.提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug:2.日志信息可以输出到不同的地方(数据库,文件,邮箱等). 二. L ...
- PHP读写文件高并发处理实例-转
背景: 最近公司游戏开发需要知道游戏加载的流失率.因为,我们做的是网页游戏.玩过网页游戏的人都知道,进入游戏前要加载一些资源.最后才能到达创建角色的游戏界面.我们有一个需求就是要统计在加载过程中还未到 ...
- 《Microsoft SQL Server 2008 Internals》读书笔记
http://www.cnblogs.com/downmoon/archive/2010/01/26/1656411.html
- 译:用InnoSetup模块化安装依赖项
译文出处:http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup 源文件下载:http://fi ...
- mono+jexus 之连接数据库
System.ArgumentException Unable to find the requested .Net Framework Data Provider. It may not be in ...
- DMSFrame 之简单用法(一)
1.DMSFrame是一个完整的ORM框架,框架相对来说也比成熟了.使用上有些地方还是比较方便的.DLL文件大约300K左右,但却可以支持各种方式的查询,完全的LINQ化的方式书写代码,更有利于维护. ...
- Android应用安全之Android APP通用型拒绝服务漏洞
0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应 ...
- 关于 iOS 的一些学习资料
iOS.Book.Effective Objective-C 2.0 1. 中文翻译版 (更新中) https://github.com/HagerHu/effective-objective-c-2 ...