CLR Via C# 3rd 阅读摘要 -- Chapter 9 - Parameters
Optional and Named Parameters
1. 可以为方法参数,构造器参数,带参数的属性(C#的索引器)指定默认值;
2. 有默认值的参数必须在最右边。只有一个例外:params的数组参数;
3. 默认值必须是编译期可确定的常量。可以用default和new关键字来表示;
4. 注意别重命名参数名,因为调用者可能在他的代码中用了参数名;
5. 修改参数的默认值会有潜在危险;
6. 不能为ref 或 out的参数设置默认值;
7. 调用方法时参数可以按次序。但是,命名的参数必须始终在参数列表的最后;
8. 可以以命名参数的形式传入参数,但是所有需要的参数在编译时必须被传入;
9. C#不允许用,来忽略参数;
10. 如果参数定义有ref 或 out时,通过命名参数的方式调用时需要加上ref 或 out,但是C#在COM Interop时又允许忽略,娘的真绕。
Implicitly Typed Local Variables
1. 说穿了不就是个var吗,只要注意不要跟dynamic搞混了就行。
Passing Parameters by Reference to a Method
1. 写代码时,必须搞清楚方法的每个参数是以值还是引用传递的;
2. out跟ref的差别:out,调用者不需要初始化传入的参数,被调用的方法必须在调用返回前初始化该参数,对该变量只写不读;ref,调用者必须初始化传入的参数,被调用的方法对该变量可读可写;
3. our和ref的共性:它们传递的都是实例的指针;
4. 可以使用ref 或 out来重载方法,但是不能用ref来重载out或者用out来重载ref。
Passing a Variable Number of Arguments to a Method
1. params关键字;
2. params的方法会带来性能的负面影响,除非显示的传入null;
3. 在定义params参数的方法时,可以考虑重载几个最常用的方法来避免性能问题。
Parameter and Return Type Guildlines
1. 当声明方法的参数类型时,通常指定最弱的类型,优先使用接口来代替基类;
2. 在声明方法的返回类型时,反过来,通常指定最强的类型;
3. 但是,如果有一个方法返回一个List<T>的对象, 那就很可能希望该方法的内部实现将来会改成返回T[],在这种情况下,返回IList<T>更合适。
Const-ness
1. C++的const关键字;
2. CLR不支持,没啥意思。
本章小结
本章主要讲的就是有哪些途径把参数传入方法中,包括如何选择性的指定参数,命名参数,通过引用传递参数,如果定义可以接收可变参数的方法。最后还给出了方法的参数和返回值的参考指南。