【问题标题】:Why do powershell class properties require this within their methods?为什么 powershell 类属性在其方法中需要这个?
【发布时间】:2020-08-24 07:29:09
【问题描述】:

PS版本:5.1.17134.858

我没有对 Powershell 的类做很多工作,但这里有一个简单的例子来说明我遇到的问题:

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

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

   [String] ToString(){return "xNode: $MyID"}
}

不解析它给出了两个错误:
第 6 行 $MyID..., "Cannot assign property, use '$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)"}
}

但是我宁愿不必一直在整个地方输入this.,是否可能有一些环境设置或我忽略的东西?

(注意:要让它在命令行中工作,我还需要删除所有的空行)

【问题讨论】:

    标签: powershell class methods properties powershell-5.0


    【解决方案1】:

    但是我宁愿不必继续输入这个。到处都是,可能有一些环境设置或我忽略的东西吗?

    不,它像宣传的那样工作,如果没有 $this 变量引用,您无法在类中引用实例属性。

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

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

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

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

    通过要求所有“instance-plumbing”通过$this 进行路由,这个为类成员遵守一组规则而不是其他所有规则的问题在范围上变得更小,并且现有的编辑器工具可以继续(有点)只需很少的更改即可工作。

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

    【讨论】:

    • 那是帮助文档使用成员属性不正确吗?
    • 是(或至少是)。如果您查看about_Classes help file 的当前版本,所有示例都一致使用$this.Member
    • 谢谢,我想我还没有意识到自己处于最前沿。
    • 嗯,显然$PropertyVar=$this.PropertyVar 也不能作为解决方法。
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2013-06-07
    • 2019-10-17
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多