visual C#(十一)理解参数数组

参考书:《 visual C# 从入门到精通》
第二部分 理解C#对象模型
第11章 理解参数数组

11.1 回顾重载

重载虽然很好用,但有时还是会不那么方便,当参数数量变化时重载就很难解决了。C#提供一种技术允许只写一个方法就能接受数量可变的参数:参数数组(关键字params声明的参数)。

11.2 使用数组参数

class Util{
    public static int Min(int[] paramList){
        if(paramList==null || paramList.Length==0){
            throw new ArgumentException("Util.Min: not enough arguments");
        }
        int currentMin=paramList[0];
        foreach(int i in paramList){
            if(i<current){
                currentMin=i;
            }
        }
        return currentMin;
    }
}

上述代码实现了求多个int 变量的最小值,但需要求几个数的最小值时需要创建额外的数组,当然也可以使用匿名数组:int min=Util.Min(new int[]{first,second,third});

11.2.1 声明参数数组

class Util{
    public static int Min(params int[] paramList){
        ...;
    }
}

这样的话调用方法时可以传递任意数量的参数实参。

int min =Util.Min(first,second);

编译器自动将上述调用转换成如下代码:

int[] array=new int[2];
array[0]=first;
array[1]=second;
int min=util.Min(array);

参数数组需要注意几点:

  • 只能为一维数组使用params关键字
  • params关键字不是方法签名的一部分,不能依赖它来重载方法
  • 不允许为参数数组指定修饰符refout
  • params数组必须是方法的最后一个参数,所以每个方法只能有一个参数数组
  • params方法总是由于params方法,所以还是可以创建方法的重载版本

11.2.2 使用params object[]

如果参数类型和数量都不固定,就需要object了,编译器通过装箱将值类型转换成对象。如:

class Black{
    public static void Hole(params object[] paramList){
        ...;
    }
}

我们将这样的方法称为Black.Hole(黑洞)。

11.2.3 使用参数数组

如我们实际使用时:

Util.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace c_11_2_3
{
    class Util
    {
        public static int Sum(params int[] paramList)
        {
            if(paramList == null)
            {
                throw new ArgumentException("Util.Sum :null parameter List");
            }
            if (paramList.Length == 0)
            {
                throw new ArgumentException("Util.Sum: empty parameter List");
            }
            int sumTotal = 0;
            foreach(int i in paramList)
            {
                sumTotal += i;
            }
            return sumTotal;
        }
    }
}

Program.cs

using Microsoft.VisualBasic.CompilerServices;
using System;

namespace c_11_2_3
{
    class Program
    {
        static void dowork()
        {
            //Console.WriteLine(Util.Sum(null));
            //Console.WriteLine(Util.Sum());
            Console.WriteLine(Util.Sum(10, 9, 8, 7, 6, 5, 4, 3, 2, 1));
        }
        static void Main(string[] args)
        {
            try
            {
                dowork();
            }catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
        }
    }
}

11.3 比较参数数组和可选参数

参数数组和可选参数有着根本的不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值