可选参数和命名参数

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值,或者对包含零个元素的一个数组的引用。

参数和返回类型的指导原则

声明方法的参数类型时,应尽量指定最弱的类型,最好是接口而不是基类; 相反,一般最好是将方法的返回类型声明为最强的类型。

 

 

posted on 2012-12-06 17:16  逝者如斯(乎)  阅读(396)  评论(0编辑  收藏  举报