我是一名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符号可用?
是否有理由使用其中一个?
谢谢!
答案 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()
不再有任何不同。