Powershell - " - "之间的区别(破折号)和"。" (连字符)

时间:2016-11-01 13:13:22

标签: powershell

我是一名C#程序员,我一直在随意学习PowerShell(根据需要)。关于在powershell中使用点和连字符之间的区别,我有几个(希望)快速的问题。

例如,在数组的情况下。

$arr = @("sam", "mitch", "stan") #create array
$arr.Contains("sam") #contains, apparently .NET?
$arr -contains "sam" #contains, apparently PS?

"包含"有什么区别?电话?

是什么导致.Contains()可用?我知道.NET数组有一个.Contains方法......这是一回事吗?是否可以使用公共存取器? PS只是"知道"什么是.NET数组?

是什么原因导致-contains符号可用?

是否有理由使用其中一个?

谢谢!

1 个答案:

答案 0 :(得分:2)

来自C#世界,让我们暂时假装Contains()只是Enumerable上的一种扩展方法... not far from the truth

考虑到这一点,记住在C#中调用arr.Contains( ... )是语法糖是很重要的。 真实语法实际上是Enumerable.Contains(arr, ... )

这里发生了类似的事情。在PowerShell中,您有一些名为Cmdlets的东西。 Cmdlet构成了该语言惯用API的主要部分。 Cmdlet有很多可选参数可以确定Cmdlet实际执行的操作,这很常见。 Cmdlet参数的语法如下所示:

 CmdletName -argumentname "optional argument parameter"

现在,我知道这段代码($arr -contains "sam")并不完全遵循这种模式,但它是理解powershell正在做什么的更好方法。就PowerShell而言,对于首先学习它的人来说,最惯用的代码就是使用" native" cmdlet参数样式语法:

$arr -contains "sam"

我把本机放在这里的恐慌引用中,因为Powershell最终在.Net上有很大的依赖,并且可能它调用完全相同的.Net Contains()方法,就像.Net一样:查找$arr对象引用以解析并调用它的Contains()函数。甚至可能是,当它归结为它时,$arr.Contains("sam")是Powershell执行环境产生所需函数调用的更直接的路径。然而,当我在罗马时...我尝试尽可能使用自然的powershell语法,即使作为C#用户,另一种方式对我来说更自然,我也不会总是成功。

尽管如此,您对-contains是运营商的问题的评论也非常接近。看看其他powershell等于运算符:-eq-ne, - lt-gt-le-ge,{{1为了帮助他们感觉更熟悉,让我们回到C#,看看C#如何真正做到平等;它的不是 -like。相反,C#最重要的相等运算符通常是==。突然间,这与obj.Equals()不再有任何不同。