Почему свойства класса PowerShell требуют этого в своих методах? - PullRequest
0 голосов
/ 08 мая 2020

PSVersion: 5.1.17134.858

Я не много работал с классами Powershell, но вот простой пример того, с чем я сталкиваюсь:

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

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

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

не 't parse выдает две ошибки:
строка 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)"}
}

Однако я бы предпочел не набирать this. повсюду, есть ли какие-то настройки среды или что-то, что я упустил?

(Примечание: чтобы заставить его работать в командной строке, мне также нужно было удалить все пустые строки)

1 Ответ

4 голосов
/ 08 мая 2020

Однако я бы предпочел не набирать это снова и снова. повсюду, может быть, есть какие-то настройки среды или что-то, что я упустил?

Нет, он работает, как рекламируется, вы не можете ссылаться на свойства экземпляра внутри класса без переменной $this ссылка.

Почему свойства класса PowerShell требуют этого в своих методах?

(Ниже приводится то, что я бы назвал «квалифицированным предположением», ie. не официальное объяснение)

Классы PowerShell немного сложны с точки зрения разработчиков, потому что свойство. NET ведет себя иначе, чем, скажем, свойство. в блоке сценария PowerShell или в обычной переменной.

Это означает, что когда языковой движок анализирует, анализирует и компилирует код, составляющий ваш класс PowerShell, необходимо уделять особое внимание тому, какие правила и ограничения применяются к любому из них.

Требуя, чтобы все "инстансы-сантехника" проходили через $this, эта проблема соблюдения одного набора правил для членов класса по сравнению со всем остальным становится намного меньше по объему, и существующие инструменты редактора могут продолжать ( вроде) работают с очень небольшими изменениями.

С точки зрения пользователя требование $this также помогает предотвратить случайные ошибки, такие как перезапись членов экземпляра при создании новых локальных переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...