首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PSObject、Hashtable和PSCustomObject的区别

PSObject、Hashtable和PSCustomObject的区别
EN

Stack Overflow用户
提问于 2012-12-23 16:52:25
回答 7查看 61.1K关注 0票数 56

有人能解释一下细节吗?如果我创建一个对象使用

代码语言:javascript
复制
$var = [PSObject]@{a=1;b=2;c=3}

然后我使用getType() PowerShell查找它的类型,PowerShell告诉我它的类型是Hashtable

当使用Get成员 (别名gm)检查对象时,显然已经创建了哈希表,因为它具有keysvalues属性。那么,“普通”哈希表有什么区别呢?

另外,使用PSCustomObject的好处是什么?当使用这样的方法创建一个

代码语言:javascript
复制
$var = [PSCustomObject]@{a=1;b=2;c=3}

对我来说,唯一明显的区别是PSCustomObject.的不同数据类型。另外,使用gm进行检查而不是键和值属性显示,现在每个键都被添加为NoteProperty对象。

但我有什么优势呢?我可以使用它的键来访问我的值,就像在哈希表中一样。我可以在PSCustomObject中存储更多的简单键值对(例如,键-对象对),就像在哈希表中一样。那么有什么好处呢?有什么重要的区别吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-05-06 05:52:12

文档

包装一个对象,提供可用成员的备用视图和扩展它们的方法。成员可以是方法、属性、参数化属性等。

换句话说,PSObject是一个对象,您可以在创建它之后向它添加方法和属性。

来自“关于哈希表”的文档

哈希表(也称为字典或关联数组)是存储一个或多个键/值对的紧凑数据结构。 ..。 哈希表之所以经常使用,是因为它们在查找和检索数据方面非常有效。

您可以像使用PSObject一样使用Hashtable,因为PowerShell允许您向PSObjects添加属性,但是不应该这样做,因为您将失去对Hashtable特定功能的访问,例如KeysValues属性。此外,可能会有性能成本和额外的内存使用。

PSCustomObject

当使用不带参数的PSObject构造函数时,充当占位符BaseObject。

我不清楚这一点,但来自许多PowerShell书籍的合著者许多PowerShell书籍的合著者似乎更清楚:

PSCustomObject是一种类型的加速器。它构造一个PSObject,但是这样做会导致哈希表键变成属性。PSCustomObject本身不是一个对象类型--它是一个进程快捷方式。..。PSCustomObject是一个占位符,用于在没有构造函数参数的情况下调用PSObject。

关于您的代码,@{a=1;b=2;c=3}是一个Hashtable[PSObject]@{a=1;b=2;c=3}不会将Hashtable转换为PSObject或生成错误。对象仍然是一个Hashtable。但是,[PSCustomObject]@{a=1;b=2;c=3}Hashtable转换为PSObject。我无法找到说明为什么会发生这种情况的文档。

如果要将Hashtable转换为对象以将其键用作属性名称,则可以使用以下代码行之一:

代码语言:javascript
复制
[PSCustomObject]@{a=1;b=2;c=3}

# OR

New-Object PSObject -Property @{a=1;b=2;c=3}

# NOTE: Both have the type PSCustomObject

如果要将许多Hashtables转换为其键为属性名称的对象,则可以使用以下代码:

代码语言:javascript
复制
@{name='a';num=1},@{name='b';num=2} |
 % { [PSCustomObject]$_ }

# OR

@{name='a';num=1},@{name='b';num=2} |
 % { New-Object PSObject -Property $_ }

<#
Outputs:

name num
---- ---
a      1
b      2
#>

很难找到有关NoteProperty的文档。文档,除了NoteProperty之外,没有任何添加对象属性有意义的-MemberType。Windows PowerShell Cookbook (第3版)将Noteproperty Membertype定义为:

由您提供的初始值定义的属性。

  • Lee,H. (2013)。Windows PowerShell烹饪本。O‘’Reilly,Inc. p. 895
票数 32
EN

Stack Overflow用户

发布于 2014-05-09 03:10:10

使用[PSCustomObject]而不是HashTable的一个场景是需要它们的集合。以下是说明如何处理它们的不同之处:

代码语言:javascript
复制
$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将导致$Hash的以下结果

代码语言:javascript
复制
Name    Value
----    -----
Name    Object 1
Squared 1
Index   1
Name    Object 2
Squared 4
Index   2
Name    Object 3
Squared 9
...

以及$CustomObject的以下内容

代码语言:javascript
复制
Name      Index Squared
----      ----- -------
Object 1      1       1
Object 2      2       4
Object 3      3       9
Object 4      4      16
Object 5      5      25
...

同样的事情发生在Export-Csv上,因此使用[PSCustomObject]而不是普通HashTable的原因。

票数 47
EN

Stack Overflow用户

发布于 2014-11-11 17:56:34

假设我想创建一个文件夹。如果我使用PSObject,您可以通过查看它来判断它是错误的。

代码语言:javascript
复制
PS > [PSObject] @{Path='foo'; Type='directory'}

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

然而,PSCustomObject看起来是正确的

代码语言:javascript
复制
PS > [PSCustomObject] @{Path='foo'; Type='directory'}

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

然后,我可以对对象进行管道传输。

代码语言:javascript
复制
[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item
票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14012773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档