我发现很难在Google上搜索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
在上面的代码中,$vals1
和$vals2
似乎都有相同的结果(一个包含2个元素的数组)。我通常会使用第一种方法,但在示例中(同时使用Split
和其他方法调用),我看到使用了第二种方法。
我的问题是,第二个是做什么不同的,使用它有什么好处,我可能不理解?
编辑:请不要关注Split
方法-我不是在问Split
的重载!
3条答案
按热度按时间ou6hu8tu1#
Split
方法有多个重载。第二个示例将创建一个字符串数组,该数组将被转换为char[],因为它在双引号中只有一个字符。但是,如果您想要拆分为两个字符,则第二个示例将不起作用,因此我不会使用它。但是,PowerShell的拆分方式是使用
-split
:mqkwyuun2#
用作一元的逗号操作符就是您所看到的。这是创建数组的一种快捷方式。PowerShell将在管道中展开阵列,这通常是所需的和标准行为。在我看来,这通常是为了缓解PowerShell的这一特性
然后,在某些情况下,您将通过该数组前面的逗号一元运算符来展开整个数组,尽管您不希望PowerShell展开整个数组。考虑产出上的差异
使用常规数组表示法
使用一元运算符创建锯齿数组
在第二个示例中,数组作为一个整体进行传递。PowerShell仍然将其从具有一个本身是数组的元素的单个数组展开到单个数组1、2、3。
也有其他使用它的情况。我更常看到用
1,2,3
静态声明的常规数组,或者有时需要使用@()
。这两种情况的结果是相同的。zujrkrfu3#
,";"
是创建数组的诀窍/速记(试试(,";").GetType()
)。你为什么需要这个?那么,让我们尝试直接使用值列表调用Split
:无法将“Split”的参数“count”(值为“b”)转换为类型“System.Int32”:“无法将值”b“转换为类型”System.Int32“。错误:”输入字符串的格式不正确。“”
不起作用,因为参数是单独传递的,而不是作为
char[]
传递的。那么,我们可以使用逗号技巧来解决这个问题吗?无法将“Split”的参数“Separator”(值为“System.Object[]”)转换为类型“System.Char[]”:“无法将类型为”System.Object[]“的”System.Object[]“值转换为类型”“System.Char”“。”
不,因为我们仍然有一个类型不匹配。这是因为这种方法太聪明了,不利于自身的利益。创建数组的一种更具可读性的方法是
@()
操作符:这就调用了所需的
Split
重载。