zoukankan      html  css  js  c++  java
  • c#中可变参数params关键字学习

    引用 https://www.cnblogs.com/maowp/p/8134342.html

    基础知识

    1、概念

    params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候。 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

    2、注意项

    1、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后

    2、不允许将params修饰符与ref和out修饰符组合起来使用。

    3、参数数组必须是一维数组。

    4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。

    5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。

    https://www.cnblogs.com/facingwaller/archive/2010/12/28/advance_in_csharp_about_params.html

    简单实例

      

      static Int32 Add(params Int32[] values)
            {
    
                // NOTE: it is possible to pass the 'values'
    
                // array to other methods if you want to.
    
                Int32 sum = 0;
    
                if (values != null)
                {
    
                    for (Int32 x = 0; x < values.Length; x++)
    
                        sum += values[x];
    
                }
    
                return sum;
    
            }
    
            public static void Main()
            {
                var result1 = Add(1, 2, 3, 4, 5);
    
                var result2 = Add(1);
    
                var result3 = Add(1);
    
            }

    原理和性能

      public static void Main()
            {
    
                DisplayTypes(1, 3, 4);
    
                DisplayTypes(new Object[] { 1, 3, 4 });
    
                Console.Read();
    
            }

    //编译后

    DisplayTypes(new object[] { (int) 1, (int) 3, (int) 4 });
    DisplayTypes(new object[] { (int) 1, (int) 3, (int) 4 });

    总之就是param就是提示编译器实现对参数进行数组封装,将可变数目的控制由编译器来完成。

    性能

    其实质其实构造一个 array 在编译时确定其长度来 承载可变个数的参数.但性能上并不划算:因为需要额外构造一个array。

    1在堆上分配内存

    2初始化其元素

    3最后还得被回收。

    总结

    1、 一般情况下不要用这种写法。

    2、 除非简易型的需要,参数类型相同,只是个数可能是1个或多个(两三个那种,逐个罗列),可以方便使用。如params guid[] customerIds,

    需要给人发消息时,接收人可能是1个或多个。

    其实是一种正常传数组的偷懒写法。传数组的写法编译时比较干练,性能稍微好点。适用于1个或很多个人。因为不方便逐个罗列每个元素。

    元素个数为三五个那种,用params写起来方便,逐个罗列,如。如ReceiveMessage(“hello”,“张三”,”李四”,”王五”)

    拓展学习

    1参数和返回值尽量使用接口和基类

    显而易见,可以适用被更多种(派生)类型。

    2、大牛博主撞破南墙有一系列的c#基础进阶博客,可以拓展学习下。

    https://www.cnblogs.com/facingwaller/archive/2010/12/28/advance_in_csharp_about_params.html

     

  • 相关阅读:
    leetcode231
    leetcode326
    leetcode202
    leetcode121
    leetcode405
    leetcode415
    2019-9-2-win10-uwp-应用转后台清理内存
    2019-9-2-win10-uwp-应用转后台清理内存
    ACM学习心得
    ACM学习心得
  • 原文地址:https://www.cnblogs.com/taoshengyujiu/p/10113265.html
Copyright © 2011-2022 走看看