大括号、逗号、参数方法调用

Jam*_*iec 3 powershell

中执行方法调用的这两种方式之间的区别的答案:

$member = "1.2.3.4:567" # IPaddress + port for demonstration
$vals1 = $member.Split(":") # typical .NET way of executing String.Split
$vals2 = $member.Split( (,":") ) # something else which ive seen in examples which I dont understand
Run Code Online (Sandbox Code Playgroud)

在上面,$vals1$vals2似乎具有相同的结果(具有 2 个元素的数组)。我通常会使用第一种方法,但在示例(使用两种方法调用Split和其他方法调用)中,我看到使用第二种方法。

我的问题是第二个在做什么,这是不同的,使用它有什么我可能不明白的优点吗?


编辑:请不要关注该Split方法 - 我不是在问 的重载Split

Mat*_*att 5

您所看到的是用作一元的逗号运算符。这是创建数组的简写方法。PowerShell 将在管道中展开数组,这通常是所需的标准行为。我认为这种常用方法是为了减轻 PowerShell 的该功能

尽管您不希望 PowerShell 展开完整的数组,但在某些情况下您会通过该数组前面的逗号一元运算符来执行此操作。考虑输出的差异

使用常规数组表示法

$array = 1,2,3
$array.Count
$array | ForEach-Object{$_.GetType().FullName}

3
System.Int32
System.Int32
System.Int32
Run Code Online (Sandbox Code Playgroud)

使用一元运算符创建锯齿状数组

$commaArray = ,@(1,2,3)
$commaArray.Count
$commaArray | ForEach-Object{$_.GetType().FullName}

1
System.Object[]
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,数组作为整体传递。PowerShell 仍然将其从具有一个元素(该元素本身就是一个数组)的单个数组展开到单个数组 1、2、3。

还有其他使用它的情况。我更常见的是静态声明的常规数组,1,2,3或者有时@()需要取决于。两者的结果是相同的。