C#体系小说之参数

解决的机要难题:

  1. 什么样可选地制定参数
  2. 按名称钦点参数
  3. 按引用传递参数
  4. 怎么着定义方法来接受可变多少的参数

小说的基本点内容:

  • 可选参数和命名参数
  • 隐式类型的有的变量
  • 以传引用的措施向方法传递参数
  • 向方法传递可变多少的参数
  • 参数和重临类型的设计规范
  • 常量性

壹.1可选参数和命名参数

在点子中为局地参数内定暗中认可值的条条框框和准星:

  • 可为方法,构造器方法和有参属性(C#索引器)的参数,委托定义一部分的参数钦点暗中同意值。并且暗许值必须是编写翻译时能明确的常量值,能够是基元类型,枚举类型以技术设为null的其他引用类型。能够动用default和new来设置暗中认可值
  • 不要重命名参数变量(否则调用者在以传参数名的不二秘籍传递实参时要修改代码)。如若措施被模块的表面实行调用,不要随便更改私下认可值,比如上面包车型大巴例子:
                               

    //不要这样做
    private static string MakePath(string filename="Untitled")
    {
        return string.Format(@"C:\{0}.txt",filename);
    }
    //而要这样做
    private static string MakePath(string filename=null)
    {
        return string.Format(@"C:\{0}.txt",filename??"Untitled");
    }
    

     

  • 假若参数用ref或out关键字展开标识,则无法设置暗许值,因为尚未办法为这几个参数传递有含义的暗中认可值。

调用方法时,传参数时规则和规格:

  • 取名参数只可以出现在实参列表的尾巴
  • 全体必须的实参必须都传送
  • 1旦参数供给ref/out,为了以传递参数名的章程传送实参,要动用上面语法:

    //方法的宣示
    private static void M(ref int x){…….}

    //方法的调用
    int a = 5;
    M(x:ref a);

 其余不能够用var注明方法的参数类型,不要混淆dynamic和var。用var注解局地变量只是一种简化的语法,他须求编写翻译器根据表达式猜度出切实数据类型,其只可以注解方法内部的一部分变量,而dynamic关键字适用于部分变量,字段和参数。其它,必须出示早先化用var注脚的变量。

 

一.二以传引用的主意向方法传递参数(out
ref)

   
 CL凯雷德暗许全部办法参数都传值,对于引用类型,对象的指针被传给方法,这一个指针也是当做值来传递的,意味着方法能修改对象。对于值类型,由于是在栈上,传给方法是2个副本,调用者中的实例不受影响。

   
 CLHighlander不区分out和ref,无论用哪些都会扭转相同的IL代码。元数据除了有一个bit用于评释是out照旧ref外,剩下大致同一。用out标记注脚调用者在调用方法以前不愿意你已初阶化好了对象,被调用的办法不可能读取参数的值,要求回到前必须向那一个值写入。用ref标记,调用者就务须先初阶化参数的值。为较大的值类型使用out,可进步代码执行效能,因为它防止了在展开格局调用时复制值类型实例的字段。

     CL凯雷德允许依照使用的是out 照旧ref参数对章程举办重载,例如:

     

//如下两个方法可以实现重载,
//但是如果只有out和ref区别,则不合法,
//因为两个签名的元数据形式相同
public class Point
{
    void Add(Point p){.....};
    void Add(ref Point p){.....};
}

 

一.三向方法传递可变多少的参数

   使用如下宣示,接受可变多少的参数

  

int Add(params int[] values)
{
   int sum =0;
   if(values!=null)
   {
      for(int x = 0; x<values.length;x++){.....}
    }
   return sum
}

调用时能够是Add(new int[]{1,二,3…});也能够是Add(一,贰,三…);

       
编写翻译器在检查实验到方法调用时,会检讨有着拥有钦点名称同时参数未有应用ParamArray本性的章程。找到就生成调用它所需的代码,否则就反省选取ParamArray性格的艺术,此时编写翻译器生成代码构造多个数组,填充元素,再生成代码来调用所选的不二秘诀。

       
只有方法最终四个参数才得以用Params关键字标记,也只能标识壹组数组(任意类型),可传递null或不传值;

       
调用参数数量可变的情势对品质兼备影响(除非显式传递null)。究竟数组对象必须在堆上分配,数组元素必须初步化,而且数组内部存储器最终须要垃圾回收。为此能够定义多少个未有运用params关键字的重载版本。

1.四参数和再次回到类型的设计规范

       
评释方法参数类型应竭尽钦赐最弱类型,宁愿要接口也决不基类。比如拍卖一组数据项,最佳用IEnumerable<T>,而毫不用强数据类型List<T>或强接口类型ICollection<T>或IList<T>。原因是要硬着头皮使接受的参数范围广,更加灵活。相反1般将艺术重临类型声明为最强类型(幸免受限于特定类型)。由此可知确认保证调用者调用方法有尽量大的油滑,使艺术适用范围越来越大。

       
 有时在不影响调用者前提下修改章程内部贯彻。假设措施重回List<string>,大概会在今后有些时候修改内部方法实现重回string[]。若想维持一定的油滑,能够选拔较弱的回来类型。比如IList<string>不建议选择最弱的IEnumerable<string>,也不选拔较强的IConllction<string>

 

相关文章