有时候我们希望参数的数量可变。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string fullName;
fullName = Combine(Directory.GetCurrentDirectory(), "bin", "config", "index.html");
Console.WriteLine(fullName);
fullName = Combine(Environment.SystemDirectory, "Temp", "index.html");
Console.WriteLine(fullName);
fullName = Combine(new string[] { "C:\\", "Data", "HomeDir", "index.html" });
Console.WriteLine(fullName);
Console.ReadKey();
}
static string Combine(params string[] paths)
{
string result = string.Empty;
foreach (string path in paths)
{
result = Path.Combine(result, path);
}
return result;
}
}
}
//D:\C#\ConsoleApp1\ConsoleApp1\bin\Debug\bin\config\index.html
//C:\WINDOWS\system32\Temp\index.html
//C:\Data\HomeDir\index.html
*PathEx.Combine() 完全等价于 Path.Combine() ,只是能处理数量可变的参数,而非只能处理两个。
Combine 方法接受数量可变的参数,要么以逗号分隔的字符串参数,要么是单个字符串数组,前者称为方法调用的 展开(expanded) ,后者称为 正常(normal) 形式。
为了获得这样的效果,Combine 方法需要:
- 在方法声明的最后一个参数前添加 params 关键字
- 将最后一个参数声明为数组
参数数组要注意以下几点:
- 参数数组不一定是方法的唯一参数,但必须是最后一个。由于只能放在最后,所以最多只能有一个参数数组。
- 调用者可指定和参数数组对应的零个实参,这会使传递的参数数组包含零个数据项。
- 参数数组是类型安全的——实参类型必须兼容参数数组的类型。
- 调用者可传递一个实际的数组,而不是传递以逗号分隔的参数列表。最终生成的CIL代码一样。
- 如目标方法的实现要求一个最起码的参数数量,请在方法声明中显式指定必须提供的参数。这样一来,遗漏必须的参数会导致编译器报错,而不必依赖运行时错误处理。例如,使用 int Max(int first,params int[] operands) 而不是 int Max(params int[] operands),确保至少有一个整数实参传递给Max。