2012-12-23 11 views
17

Czy ktoś może wyjaśnić szczegóły? Jeśli utworzyć obiektu przy użyciuRóżnica między PSObject, Hashtable i PSCustomObject

$var = [PSObject]@{a=1;b=2;c=3} 

a potem patrzę na tego typu przy użyciu getType() PowerShell mówi mi jego typu Hashtable. Podczas korzystania z gm do inspekcji obiektu jest oczywiste, że została utworzona tablica haszująca, ponieważ ma ona klucze i właściwość value. Więc jaka jest różnica do "normalnego" hashtable?

Co jest zaletą korzystania z PSCustomObject? Tworząc jedną użyciu coś jak ten

$var = [PSCustomObject]@{a=1;b=2;c=3} 

jedyną widoczną różnicą jest dla mnie inny typ danych z PSCustomObject. Również zamiast kluczy i właściwości wartości inspekcja z gm pokazuje, że teraz każdy klucz został dodany jako obiekt NoteProperty. Ale jakie mam zalety? Jestem w stanie uzyskać dostęp do moich wartości za pomocą kluczy, tak jak w hashtable. Mogę przechowywać więcej niż proste pary klucz-wartość (np. Pary klucz-obiekt) w PSCustomObject, JUST, jak w hashtable. Więc jaka jest przewaga? Czy są jakieś ważne różnice?

Odpowiedz

1
+1

Dobrze , wydajność - w porządku. Ale czy to wszystko? Również wydajność jest pro hashtable. Więc jakie jest prawo do istnienia dla PSCustomObject? I naprawdę domyślna opcja wyświetlania? Często mamy do czynienia z danymi - nikt nie chce tego codziennie wyświetlać. Od czasu do czasu, gdy potrzebuję wyświetlić jakieś dane, nadal mogę zbudować małą pętlę i użyć standardowych formaterów. Nie wydaje mi się wystarczającym uzasadnieniem dla nowego typu danych. – masi

+2

Artykuł w pierwszym linku nie mówi nic o prędkości psobject vs pscustomobject. Zamiast tego podkreśla różnicę między algorytmem O (m * n) i O (m * ln n). – JJJ

+4

"Zawsze podawaj najważniejszą część ważnego linku, na wypadek, gdyby strona docelowa była nieosiągalna lub została trwale wyłączona." - http://stackoverflow.com/help/how-to-answer – Pete

10

Zaletą myślę o psobject jest to, że można tworzyć niestandardowe metody z nim. Na przykład

$o=New-Object PSObject -Property @{ 
    "value"=9 
} 
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value { 
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))" 
} -inputObject $o 

$o.Sqrt() 

można wykorzystać do sterowania kolejnością sortowania właściwości psobject (patrz PSObject sorting)

+0

Zauważ, że możesz to zrobić zarówno z PSObject, jak i PSCustomObject. –

20

Jeden scenariusz, w którym [PSCustomObject] jest używany zamiast HashTable jest, kiedy trzeba ich kolekcję. Poniżej znajduje się zilustrować różnicę w jaki sposób są one przetwarzane:

$Hash = 1..10 | %{ @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 
$Custom = 1..10 | %{[PSCustomObject] @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 

$Hash | Format-Table -AutoSize 
$Custom | Format-Table -AutoSize 

$Hash | Export-Csv .\Hash.csv -NoTypeInformation 
$Custom | Export-Csv .\CustomObject.csv -NoTypeInformation 

Format-Table spowoduje następujące dla $Hash:

Name Value 
---- ----- 
Name Object 1 
Squared 1 
Index 1 
Name Object 2 
Squared 4 
Index 2 
Name Object 3 
Squared 9 
... 

i dodaje do $CustomObject:

Name  Index Squared 
----  ----- ------- 
Object 1  1  1 
Object 2  2  4 
Object 3  3  9 
Object 4  4  16 
Object 5  5  25 
... 

samym coś się stało z Export-Csv, więc powód do korzystania z [PSCustomObject] zamiast zwykłego HashTable

13

Powiedz, że chcę utworzyć folder.Jeśli używam PSObject można powiedzieć, że jest źle przez patrząc na to

PS > [PSObject] @{Path='foo'; Type='directory'} 

Name       Value 
----       ----- 
Path       foo 
Type       directory 

Jednak PSCustomObject wygląda poprawnie

PS > [PSCustomObject] @{Path='foo'; Type='directory'} 

Path         Type 
----         ---- 
foo          directory 

mogę wtedy rura przedmiotem

[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item 
+0

Do głosowania, ponieważ to była dokładnie odpowiedź, której szukałem. –