为什么 powershell 类属性在其方法中需要这个?

Gre*_*r y 0 methods powershell properties class powershell-5.0

PS版本:5.1.17134.858

我还没有对 Powershell 的类进行大量工作,但这里有一个简单的示例来说明我遇到的情况:

class xNode{
   [uint64]$MyID=0
   static [uint64]$ClassID=0

   xNode(){
      $MyID = [xNode]::ClassID++
   }

   [String] ToString(){return "xNode: $MyID"}
}
Run Code Online (Sandbox Code Playgroud)

不解析它会给出两个错误:
第 6 行 $MyID...,“无法分配属性,使用 '$this.MyID'。”
第 9 行 ..$MyID", "方法中未分配变量。"

我正在尝试使用名为 的类属性$MyID,并且这种用法似乎与帮助文档中给出的示例一致get-help about_Classes,当我将最后的整个示例复制到文件中然后尝试运行它时,我得到了$Head, $Body, ,...也有同样的错误$Title,当然我可以通过添加来强制它工作this.

class xNode{
   [uint64]$MyID=0
   static [uint64]$ClassID=0

   xNode(){
      $this.MyID = [xNode]::ClassID++
   }

   [String] ToString(){return "xNode: $($this.MyID)"}
}
Run Code Online (Sandbox Code Playgroud)

然而,我不想继续到处打字this.,是否有一些环境设置或我忽略的东西?

(注意:为了让它在命令行上工作,我还需要删除所有空白行)

Mat*_*sen 5

不过我不想继续输入这个。到处都是,是否有一些环境设置或我忽略的东西?

不,它的工作方式如广告所示,如果没有变量引用,您无法引用类内的实例属性$this

为什么 powershell 类属性在其方法中需要这个?

(以下是我所说的“合格推测”,即不是官方来源的解释)

从实现者的角度来看, PowerShell 类有点棘手,因为 .NET 属性的行为与 powershell 脚本块中的参数或常规变量不同。

这意味着当语言引擎解析、分析和编译构成 PowerShell 类的代码时,必须特别注意哪些规则和约束适用于其中任何一个。

通过要求所有“实例管道”都经过路由$this,观察类成员的一组规则与其他所有规则的问题在范围上变得小得多,并且现有的编辑器工具可以继续(在某种程度上)工作而只需很少的改变。

从用户的角度来看,require$this还有助于防止意外事故,例如在创建新的局部变量时覆盖实例成员。