C#参数列表中的params

  1. 在参数数目可变时采用方法参数params。
  2. params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。
  3. params不允许与ref\out组合使用。
  4. params在你不知道参数数量时显得很有用,虽然也可以使用List等集合代替,但是params显得更直观。
  5. params只能用于一维数组,不能用于多维数组和诸如ArrayList、List<T>等类似于数组的集合类型。
  6. 因为是可变长,所以长度可以为0,也就是省略。
  7. 可变参数和不变参数可以同时存在。
  8. 若实参是数组则按引用传递,若实参是表达式则按值传递。

参考资料:

https://blog.youkuaiyun.com/dalmeeme/article/details/7193487

以下是本人调试的代码:

using System;

namespace 方法参数params
{
    class Program
    {
        static void Main(string[] args)
        {
            UseParams(1, 2, 3);//可以这样调用
            UseParams(new int[] { 110, 119, 120 });//也可以这样调用
            UseParams();//还可以这样调用
            UseParams(null);//还可以这样调用
            UseParams2(1, 'a', "test");

            //An array of objects can also be passed, as long as
            //the array type matches the method being called.
            int[] myarray = new int[3] { 10, 11, 12 };
            UseParams(myarray);

            //UseParams5(1,2);参数列表中没有params,就不能这样调用了

            UseParams6("chenwei", 1, 1, 1, 1, 1);//不变参数和可变参数可以同时存在

            UseParams7(1, 2, 3);
            int[] arr = new int[] { 4, 5, 6 };
            UseParams7(arr);//若实参是数组,则按引用传递

            Console.ReadLine();
        }

        public static void UseParams(params int[] list)
        {
            if (list == null)
            {
                Console.WriteLine("null");
                return;
            }

            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
            Console.WriteLine();
        }

        public static void UseParams2(params object[] list)
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
            Console.WriteLine();
        }

        //params必须是最后一个参数
        //public static void UseParams3(params int[] list, string str)
        //{
        //    //
        //}

        //params不允许与ref\out组合使用
        //public static void UseParams4(params ref int[] list)
        //{
        //    //
        //}

        public static void UseParams5(int[] list)
        {
            Console.WriteLine("这是5");
        }

        public static void UseParams6(string name, params int[] arr)
        {
            Console.WriteLine(name);
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }
            Console.WriteLine();
        }

        public static void UseParams7(params int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = 0;
            }

            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }

            Console.WriteLine();
        }
    }
}

 

C# 参数列表在不同场景下有多种使用方式和特性: - **参数数组(params)**:在参数数目可变时采用,params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。它不允许与ref、out组合使用,只能用于一维数组,不能用于多维数组和诸如ArrayListList<T>等类似于数组的集合类型。因为是可变长,所以长度可以为0,也就是省略。可变参数和不变参数可以同时存在。若实参是数组则按引用传递,若实参是表达式则按值传递。使用params可以让方法匹配不同数目的实参,例如: ```csharp void ListInts( params int[] inVals ) { // 方法体 } // 方法调用示例 ListInts(); // 0实参 ListInts( 1, 2, 3); // 3实参 ListInts( 4, 5, 6, 7); // 4实参 ListInts( 8, 9, 10, 11, 12); // 5实参 ``` params在不知道参数数量时显得很有用,虽然也可以使用List等集合代替,但是params显得更直观[^2][^3]。 - **扩展方法(this)**:这是在.NET 3.0之后新增的一种特性。通过该特性可以让程序员在现有的类型上添加扩展方法(无需创建新的派生类型、重新编译或者以其他方式修改原始类型)。扩展方法是一种特殊的静态方法,虽然是静态方法,但是可以像使用类型上的实例方法一样去使用扩展方法。扩展方法的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀。当在其他命名空间使用时,需要用using将扩展方法所在命名空间显式导入到源代码中。扩展方法必须在非范型静态类中定义,无法访问扩展类型中的私有变量,可以使用扩展方法来扩展类或接口,但不能重写扩展方法。与接口或类方法具有相同名称和签名的扩展方法永远不会调用。编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。通常建议只在不得已的情况下才实现扩展方法,并谨慎地实现[^4]。 - **输出参数(out)**:使用out参数,可以使方法返回多个返回值。例如: ```csharp static void Main(string[] args) { int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int max; int min; int sum; double avg; int[] arr = GetMaxMinSumAvg(numbers, out max, out min, out sum, out avg); Console.WriteLine(max); Console.WriteLine(min); Console.WriteLine(sum); Console.WriteLine(avg); Console.WriteLine(arr.Length); Console.ReadKey(); } public static int[] GetMaxMinSumAvg(int[] nums, out int max, out int min, out int sum, out double avg) { int[] res = new int[4]; max = nums.Max(); min = nums.Min(); sum = nums.Sum(); avg = nums.Average(); return res; } ``` 上述代码中,`GetMaxMinSumAvg`方法通过`out`参数返回了多个值[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值