c#基础之长度可变类型相同的参数列表

本文介绍了C#语言中params关键字的使用方法,通过实例展示了如何在方法调用时提供数量可变的实参,包括展开形式和正常形式的应用。重点说明了params关键字的位置要求、参数数组的类型安全、零参数情况以及如何确保最少参数的正确声明。

为了简化编码,c#提供了一个特殊的关键字params,允许在调用方法时提供数量可变的实参,而不是由方法实现固定好的形参数量。先看代码吧。

using System;
using System.Linq;
using System.IO;
class HelloWorld {

    static void Main() {
        string fullName;

        fullName = Combine(Directory.GetCurrentDirectory(), "bin", "config", "index.html");
        Console.WriteLine(fullName);

        fullName = Combine(Environment.SystemDirectory, "bin", "xindex.html");
        Console.WriteLine(fullName);

        fullName = Combine(new string[] { "C:", "data", "index.html" });
        Console.WriteLine(fullName);
        Console.ReadLine();
    }
    public static string Combine(params string[]paths){
        string result=string.Empty;
        foreach (string path in paths) {
            result = System.IO.Path.Combine(result, path);
        }
        return result;
    }
}

第一个Combine()调用了四个参数。第二个调用了3个参数,最后一个调用中,参数用一个数组来代替。换言之,Combine()方法接受数量可变的参数,这些参数要么是以逗号隔开,要么是单个字符串数组,前者的语法成为方法调用的”展开形式“,后者称为正常形式。

为了获得这样的效果 Combine()方法需要:

(1) 在方法的最后一个参数之前添加params关键字。

(2)将最后一个参数声明为数组。

调用System.IO.Path.Combie()方法,该方法能自动合并路径中的不同部分,并能正确使用平台的特有的目录分隔符,注意Combine()完全等价于这个方法,处理参数数量可变的参数。而不是只能处理两个。

可变参数要注意下面这些地方:

~参数数组不一定是方法的唯一参数,但必须是方法声明的最后一个参数。由于只有最后一个参数才可能是参数数组,所以方法最多只有一个参数数组。

~调用者可以指定和参数对应的零个实参,这会造成传递的参数数组包含零个数据项。

~参数数组是类型安全的,实参的类型必须兼容于参数数组元素的类型。

~调用者可以显示的使用数组,而不是以逗号分隔的参数列表,最终生成的CIL代码是一样的。

~假如目标的实现要求一个最起码的参数数量,请在方法声明中显示指定必须提供的参数。这样如果遗漏要求的参数,会导致编译器报错,而不需要依赖运行时错误处理,例:

如果一个方法要求一个或多个整型实参,那就应该使用int Max(int first,params int[] operands)来声明这个方法,而不是使用int Max(params int[] operands)来声明,这样确保至少有一个整数实参传给Max();

使用参数数组,可以将类型相同类型的,数量可变的多个参数传给方法。 在后面会讨论如何支持不同类型的,数量可变的参数。


### C# 中可变参数列表的使用方法 在 C# 编程语言中,`params` 关键字用于定义接受不定数量参数的方法。通过 `params`,开发者能够创建灵活的方法签名,允许调用者传递任意数量的同类型参数。 #### 方法声明 当使用 `params` 定义方法时,该关键字必须位于方法形参列表的最后一项,并且其后的参数会被视为数组处理。以下是基本语法: ```csharp public ReturnType MethodName(params Type[] parameterName) { // 方法体 } ``` 例如,在给定的引用中有这样一个例子[^1]: ```csharp public static void UseParams(params int[] list) { for (int i = 0; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } ``` 此方法可以接收零个或多个整型参数并逐一打印它们。如果调用时不传入任何参数,则 `list` 将是一个长度为零的数组。 #### 调用方式 调用带有 `params` 的方法有两种形式: 1. **单独列举参数**:直接提供一系列逗号分隔的具体值。 2. **传递数组实例**:显式地向方法传递一个已存在的数组对象。 下面展示两种不同的调用情形[^1]: ```csharp UseParams(1, 2, 3); // 或者 int[] numbers = {4, 5, 6}; UseParams(numbers); ``` 需要注意的是,尽管可以通过数组来调用 `params` 方法,但如果明确知道要发送单一阵列而非拆解成独立元素的话,建议省略 `params` 并改用常规重载机制以提高性能与清晰度。 另外值得注意的一点是,虽然 `params` 提供了极大的灵活性,但它仅限于一维数组作为输入类型,并且不允许与其他集合类(如 List<T>)混搭使用。 #### 结合其他特性应用案例 除了基础功能外,还可以将 `ref`, `out` 和 `params` 组合起来实现更复杂的逻辑需求。不过需注意顺序安排以及语义上的合理性[^3]。比如下面这个简单的示范展示了如何返回线程 ID 同时支持多数值操作: ```csharp public string TestMethod(int callDuration, out int threadId, params int[] values) { var sum = 0; foreach(var value in values){ sum +=value ; } Console.WriteLine($"Sum of provided integers is:{sum}"); Thread.Sleep(callDuration); threadId = Thread.CurrentThread.ManagedThreadId; return $"TestMethod executed with duration {callDuration} and total integer sum {sum}"; } ``` 以上代码片段说明了一个场景——既计算一组数字总和又报告当前运行环境的信息。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值