为什么PowerShell使用双冒号(::)来调用.NET类的静态方法?

nhr*_*bin 11 powershell

是否有任何特定的理由使用c ++样式的双冒号'::'?为什么不使用像c#这样的简单点?

And*_*ndi 25

这是Windows PowerShell in Action的问题.

::运算符是静态成员访问器.点运算符检索实例成员,而双冒号运算符访问类上的静态成员,就像最后一节末尾的示例中的join方法一样.静态成员访问器的左操作数必须是一个类型 - 类型文字或返回类型的表达式,如下所示:

PS (1) > $t = [string] 
PS (2) > $t::join('+',(1,2,3)) 
1+2+3 
PS (3) >
Run Code Online (Sandbox Code Playgroud)

由于访问静态方法的方式,语言设计团队选择使用单独的运算符来访问静态方法.这是问题所在.如果您的MyModule类型具有名为Module的静态属性,那么表达式

[MyModule].Module

很暧昧.这是因为System.Type实例上还有一个实例成员Module,表示MyModule类型.现在你无法判断是否应该检索System.Type上的"Module"实例成员或MyModule上的"Module"静态成员.通过使用双冒号运算符,您可以消除这种歧义.

注意

其他语言通过使用typeof()运算符来解决这种歧义.在此示例中使用typeof(),typeof(My Module).Module检索Type对象上的instance属性,MyModule.Module检索MyModule类实现的静态属性.

Bruce Payette(2011-08-02 16:22:31.490000-05:00).Windows PowerShell在行动,第二版(Kindle位置4494-4507).曼宁出版物.Kindle版.