В PowerShell v3.0 был представлен PSCustomObject
. Это похоже на PSObject
, только лучше. Среди других улучшений (например, сохранение порядка свойств) упрощено создание объекта из хеш-таблицы:
[PSCustomObject]@{one=1; two=2;}
Теперь кажется очевидным, что это утверждение:
[System.Management.Automation.PSCustomObject]@{one=1; two=2;}
будет работать таким же образом, потому что PSCustomObject
- это «псевдоним» для полного пространства имен + имя класса. Вместо этого я получаю сообщение об ошибке:
Невозможно преобразовать значение «System.Collections.Hashtable» типа «System.Collections.Hashtable» в тип «System.Management.Automation.PSCustomObject».
Я перечислил ускорители для обоих типов объектов:
[accelerators]::get.GetEnumerator() | where key -Like ps*object
Key Value
--- -----
psobject System.Management.Automation.PSObject
pscustomobject System.Management.Automation.PSObject
и обнаружил, что оба ссылаются на один и тот же класс PSObject
- это должно означать, что с помощью ускорителей можно делать множество других вещей, кроме простого сокращения кода.
Мои вопросы по этому поводу:
- Есть ли у вас интересные примеры различий между использованием ускорителя и использованием полного имени типа?
- Следует ли избегать использования полного имени типа, когда доступен ускоритель, в качестве общей передовой практики?
- Как проверить, возможно, используя отражение, если ускоритель делает что-то другое, а не просто указывает на базовый класс?
System.Management.Automation.Language.Compiler.VisitConvertExpression
, вы увидите, что есть специальная обработка для трех имен типов:ordered
,PSCustomObject
иref
. - person user4003407   schedule 09.03.2016