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();

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

  • 相关阅读:
    USACO castle
    【求建议】毕业之声——信院IT类毕业学子经验分享交流会
    需求管理之勇于直面需求变更
    spring boot 配置redis
    java Redis工具类
    java多线程之原子变量
    innerHTML与jquery里的html()区别介绍
    解决IE下select标签innerHTML插入option的BUG(兼容
    【转载】html中object标签详解
    最全的CSS浏览器兼容问题http://www.68design.net/Web-Guide/HTMLCSS/37154-1.html
  • 原文地址:https://www.cnblogs.com/straycats/p/14646210.html
Copyright © 2011-2022 走看看