W PowerShell v3.0 wprowadzono PSCustomObject
. To jest jak PSObject
, ale lepsze. Wśród innych usprawnień (np porządek nieruchomość jest zachowany), tworząc obiekt z hashtable jest uproszczona:Akceleratory typu PowerShell: PSObject vs PSCustomObject
[PSCustomObject]@{one=1; two=2;}
Teraz wydaje się oczywiste, że to stwierdzenie:
[System.Management.Automation.PSCustomObject]@{one=1; two=2;}
będzie działać w ten sam sposób, ponieważ PSCustomObject
jest "alias" dla pełnej przestrzeni nazw + nazwa klasy. Zamiast tego pojawia się błąd:
Cannot convert the "System.Collections.Hashtable" value of type "System.Collections.Hashtable" to type "System.Management.Automation.PSCustomObject".
I wymienione akceleratory dla obu typów obiektów:
[accelerators]::get.GetEnumerator() | where key -Like ps*object
Key Value
--- -----
psobject System.Management.Automation.PSObject
pscustomobject System.Management.Automation.PSObject
i odkrył, że zarówno odnosić się do tego samego PSObject
klasy - ma to oznaczać, że za pomocą akceleratorów można zrobić kilka innych rzeczy niż tylko skrócenie kodu.
Moje pytania dotyczące tej kwestii są:
- Czy masz jakieś ciekawe examaples różnic pomiędzy użyciem akceleratora vs użyciu pełnej nazwy typu?
- Czy należy unikać używania pełnej nazwy typu, gdy akcelerator jest dostępny jako najlepsza ogólna praktyka?
- Jak sprawdzić, może za pomocą odbicia, czy akcelerator robi coś innego niż wskazywanie na podstawową klasę?
Jeśli dekompilujesz 'System.Management.Automation.Language.Compiler.VisitConvertExpression', można zauważyć, że istnieje specjalna obsługa trzech nazw typów: 'zamówione',' PSCustomObject' i 'ref'. – PetSerAl