zoukankan      html  css  js  c++  java
  • CLR via C#学习笔记-第九章-向方法传递可变数量的参数

    9.4 向方法传递可变数量的参数

    为了接受可变数量的参数,方法要像下面这样声明

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

    params只能应用于方法签名中的最后一个参数。

    可以向下面这样调用该方法。

    Console.WriteLine(Add(new Int32[]{1,2,3,4,5}));

    数组能用任意数量的一组元素来初始化,再传给Add进行处理。

    由于params关键字的存在,我们可以这样调用Add方法。

    Console.WriteLine(Add(1,2,3,4,5));

    params关键字告诉编译器像参数应用定制特性System.ParamArrayAttribute的一个实例。

    编译器如何处理params关键字

    C#编译器检测到该方法时,检查所有具有指定名称,同时参数没有应用Params特性的方法。

    占到匹配的方法后生成调用它所需的代码。没有找到就接着检查。

    找到匹配方法,编译器生成代码构造一个数组,填充元素,再生成代码来调用所选方法。

    params关键字使用要求

    只有方法的最后一个参数才可以用params关键字。

    这个参数只能标识一维数组,任意类型。

    可为这个参数传递null,或者传递包含零个元素的一个数组的引用。

    以下Add调用能正常编译和运行,控制台显示的都是0.

    Add();
    Add((null));

    写方法获取任意数量任意类型的参数

    只需修改方法原型,让他获取一个Object[]。

    static void DisplayTypes(params Object[] object)
    {
        if(object!=null)
        {
            foreach(Object o in object)
                Console.WriteLine(o.GetType());
        }
    }

    调用该方法

    DisplayTypes(new Object(),new Random(),"Jeff",5);

    上述代码输出

    System.Object
    System.Random
    System.String
    System.Int32

    重要提示

    调用参数数量可变的方法对性能有所影响,除非显式传递null。

    毕竟数组对象必须在堆上分配。数组元素必须初始化,而且数组的内存最终需要垃圾回收。

    定义几个没有使用params关键字的重载版本可以减少对性能的影响。

    这方面的范例可以参考System.String类的Concat类。

    使用params关键字的重载用于不太常见的情形。

  • 相关阅读:
    异步编程
    MVC返回文件
    MVC源码分析
    MVC源码分析
    MVC源码分析
    MVC源码分析
    MVC源码分析
    MVC源码分析
    MVC源码分析
    MVC源码分析
  • 原文地址:https://www.cnblogs.com/errornull/p/9832601.html
Copyright © 2011-2022 走看看