zoukankan      html  css  js  c++  java
  • 【c#笔记】可变长参数(params)

    ===============================================

     2021/4/12_第1次修改                       ccb_warlock

     

    ===============================================

    最早接触关键字params还是在用string.Format拼接字符串,例如下面的例子:

    var param1 = "参数1";
    var param2 = "参数2";
    var s = string.Format("测试{0}、{1}", param1, param2);

    变量s的结果是:

    测试参数1、参数2

    当然按照上面的例子,从c# 6.0开始有更简洁的写法:

    var param1 = "参数1";
    var param2 = "参数2";
    var s = $"测试{param1}、{param2}";

    由于最近在整理java代码时看到了相同的内容,故单独记录方便做对比。

     

    params是什么

    params是c#中用来标记可变长参数的关键字。

     

    什么时候用params

    用于参数个数不确定、但类型相同的函数形参。

    怎么用

    比如下面的例子:

    首先定义一个Test方法,形参arrs用params关键字来标记这是一个可变长参数。

    private void Test(params string[] arrs)
    {
       if (null == arrs || 0 == arrs.Length)
       {
          Console.WriteLine("arrs is null or empty");
          return;
       }
    
       foreach (var arr in arrs)
       {
           Console.WriteLine($"arr is {arr}");
       }
    }

    多个参数调用如下:

    Test();
    Test("123");
    Test("abc", "def");

    控制台输出:

    arrs is null or empty
    arr is 123
    arr is abc
    arr is def

    限制条件

    1)params只能标记一维数组;

    2)在方法声明中,只允许有一个params关键字; 

    3)在方法声明中,被params关键字标记的参数之后不允许有其他参数;

    当然在params之前可以定义其他参数,例如

    public void Test(int index, params string[] arrs)
    {
      // todo
    }

    4)不能与ref、out修饰符一起使用;

    FAQ

    1.没有二义性的场景。

    当类中有下面2个方法的定义。

    public void Test(string s1, string s2)
    {
      // todo
    }
    
    public void Test(params string[] arrs)
    {
      // todo
    }

    此时调用函数Test:

    // 调用的是Test(string s1, string s2)
    Test("123", "abc");

    该场景没有二义性,编译器会首先匹配非可变长参数的方法。强烈建议在业务代码中不要这样定义,而是将2个函数合并成1个。

    2.有二义性的场景。

    当类中有下面2个方法的定义。

    public void Test(params string[] arrs)
    {
      // todo
    }
    
    public void Test(params int[] arrs)
    {
      // todo
    }

    此时调用函数Test:

    // 编译器报错
    Test();

    该场景有二义性,编译器无法判断无参时该选择哪个函数调用。

  • 相关阅读:
    cjson库的使用以及源码阅读
    Map集合 把map 集合 转成Set的方法
    JAVA 吃货联盟
    第二本 第六章 接口 采用面向接口编程组装一台计算机
    java 类和对象
    Jdk安装和环境配置
    Spring mvc 同类之间方法的互相跳转 "redirect:/manage/ManageUser";
    关于Mybatis参数传值问题(常用) 个人比较推荐第二种哦,可以减少代码量,唯一要注意的是自己传递的参数个数个顺序就好
    数据库拼接字符模糊查询语句(mybatis中运用(xml文件))
    ExpandableListAdapter实现的三程常用方式
  • 原文地址:https://www.cnblogs.com/straycats/p/14646210.html
Copyright © 2011-2022 走看看