zoukankan      html  css  js  c++  java
  • 可选参数与命名参数;可变数量的参数

    一.可选参数与命名参数

    1. 可选参数: 可以为部分或者全部形参分配默认值. 然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值.
    2. 命名参数:在使用可选参数时,可以通过制定参数名称的方法为其传递实参.

    二.准则与规则

    1. 有默认值的参数必须放在没有默认值的所有参数之后。
    2. 默认值必须是编译时能确定的常量值。例如:基元类型;枚举类型;能设为null的引用类型等。但不能设置为对象的方法和属性等。
    3. //可选参数
              static int Add(int a, int b = 2)
              {
                  return a + b;
              }
       static void Main(string[] args)
              {
                  Console.WriteLine(Add(1)); 
                  Console.WriteLine(Add(1, 3));
                  //通过命名参数调用,实参顺序可以和形参不同
                  Console.WriteLine(Add(b:6, a:1));
                  Console.ReadKey();
              }


    4. 使用命名参数传递参数时,可以按照任何顺序。命名的实参传递必须放在实参列表的尾部,也就是,非命名参数应该放在命名参数之前
    5. 如果形参标识了ref/out,命名实参应使用如下语法:
    static void Main(string[] args)
            {
                //方法调用
                Int32 a = 5;
                M(x: ref a);
            }
    
            //方法声明
            private static void M(ref Int32 x)
            { 
                
            }

    参数的调用顺序

    在命名参数出现前,函数的参数是从左到右依次调用。那么有了命名参数后,函数的调用顺序是否被改了呢?

    先看一个例子:

    static void Main(string[] args)
    {
        TestFun(P1(), P2(), P3());
    }
    
    static int P1()
    {
        Console.WriteLine("P1");
        return 1;
    }
    
    static int P2()
    {
        Console.WriteLine("P2");
        return 2;
    }
    
    static int P3()
    {
        Console.WriteLine("P3");
        return 3;
    }
    
    static void TestFun(int a, int b, int c)
    {
        Console.WriteLine(string.Format("a:{0},b:{1},c:{2}", a, b, c));
    }


    如上述代码,它的执行结果如下:
    P1
    P2
    P3
    a:1,b:2,c:3

    可以看出,参数的执行顺序是p1→p2→p3.

    那么使用命名参数后呢?顺序是否有变化呢?


    static void Main(string[] args) { TestFun(P1(),b:P3(), c: P2()); }


    执行结果如下:
    P3
    P2
    P1
    a:1,b:3,c:2

    顺序变成了:p3→p2→p1

    为什么是这样呢?

    那是因为编译器会先调用使用命名参数的参数,然后再执行剩余的参数。

    可变数量的参数

    1. 应用场景:方法需要处理的参数数量不可预定,例如:连接任意数量的字符串。
    2. 使用方法:使用params关键字修饰参数数组。
    3. 使用优点:不用在调用方显示的将参数转换为数组,可以随意的传入参数,使代码更为优美,简洁。
      class Program
          {
              static Int32 Add(params Int32[] values)
              {
                  Int32 sum = 0;
      
                  foreach (int value in values)
                      sum += value;
      
                  return sum;
              }
      
              static void Main(string[] args)
              {
                  Console.WriteLine(Add(1, 2, 3, 4, 5, 6));
              }
          }



  • 相关阅读:
    《程序员你伤不起》读书总结
    03SpringBoot用JdbcTemplates访问Mysql
    02Spring Boot配置文件详解
    01构建第一个SpringBoot工程
    java基础-04泛型
    java集合-HashSet源码解析
    java集合-HashMap源码解析
    java基础-03基本语法
    java基础-02数据类型
    java基础-01基本概念
  • 原文地址:https://www.cnblogs.com/joeylee/p/3540082.html
Copyright © 2011-2022 走看看