zoukankan      html  css  js  c++  java
  • CLR Via CSharp读书笔记(9):参数

    可选参数和命名参数

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

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

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

  • 相关阅读:
    redis学习汇总
    注解配置springMVC
    为什么MYSQL分页时使用limit+ order by会出现数据重复问题
    springMVC请求访问的整个过程
    springMVC项目配置文件
    springMVC三大组件、spring主要jar包、
    单例模式的三种实现方式
    JDBC连接数据库的7个步骤
    数据结构汇总
    Java基础汇总2019
  • 原文地址:https://www.cnblogs.com/thlzhf/p/2805436.html
Copyright © 2011-2022 走看看