可选参数和命名参数:
class OptionalAndNamedParameters { private static Int32 s_n = 0; public static void Go() { // 1. Same as: M(9, "A", default(DateTime), new Guid()); M(); // 2. Same as: M(8, "X", default(DateTime), new Guid()); M(8, "X"); // 3. Same as: M(5, "A", DateTime.Now, Guid.NewGuid()); M(5, guid: Guid.NewGuid(), dt: DateTime.Now); // 4. Same as: M(0, "1", default(DateTime), new Guid()); M(s_n++, s_n++.ToString()); // 5. Same as: 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(Int32 x = 9, 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); } }
隐式类型的局部变量:
var关键字只能用于声明方法内部的局部变量,而dynamic关键字可用于局部变量、字段和参数。
表达式不能转型为var,但能转型为dynamic。
必须显示初始化用var声明的变量,但无需初始化用dynamic声明的变量。因为var需要根据初始化的值来推断类型。
以传引用的方式向方法传递参数:
从IL和CLR的角度看,out和ref是同一码事,都导致传递指向实例的一个指针。但从编译器的角度看,两者是有区别的。根据是out还是ref,编译器会按照不同的标准来验证所写的代码是否正确。区别在于在调用端,能够明确的知道被调用的方法是否需要对传递的变量进行更改。
如果两个重载方法只有out和ref的区别,则是不合法的。
仅当方法“返回”对“方法知道的一个对象”的引用时,为引用类型使用out和ref才有意义。传递的参数必须与方法预期的参数匹配,以保障类型安全。
向方法传递可变数量的参数:
只有方法的最后一个参数才可以用params关键字(ParamArrayAttribute)来标记。此外,这个参数只能标识任意类型的一个一维数组。可以传递null值,或者对包含零个元素的一个数组的引用。
参数和返回类型的指导原则:
声明方法的参数类型时,应尽量指定最弱的类型,最好是接口而不是基类; 相反,一般最好是将方法的返回类型声明为最强的类型。