14

使用双冒号 '::' 的 c++ 风格是否有任何具体原因?为什么不使用像 c# 这样的简单点?

4

1 回答 1

31

这是 Windows PowerShell in Action 的问题。

:: 运算符是静态成员访问器。点运算符检索实例成员,而双冒号运算符访问类的静态成员,就像上一节末尾示例中的 join 方法一样。静态成员访问器的左操作数必须是类型 — 类型文字或返回类型的表达式,如您在此处看到的:

PS (1) > $t = [string] 
PS (2) > $t::join('+',(1,2,3)) 
1+2+3 
PS (3) >

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

[MyModule].Module

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

笔记

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

布鲁斯·帕耶特 (2011-08-02 16:22:31.490000-05:00)。Windows PowerShell 实战,第二版(Kindle 位置 4494-4507)。曼宁出版社。Kindle版。

于 2013-07-20T07:57:44.130 回答