在PowerShell v3.0中,引入了PSCustomObject。就像PSObject一样,但是更好。在其他改进中(例如保留了属性顺序),简化了从哈希表创建对象的过程:

[PSCustomObject]@{one=1; two=2;}

现在看来这句话很明显:
[System.Management.Automation.PSCustomObject]@{one=1; two=2;}

会以相同的方式工作,因为PSCustomObject是完整 namespace +类名的“别名”。相反,我得到一个错误:



我列出了两种对象的加速器:
[accelerators]::get.GetEnumerator() | where key -Like ps*object

    Key            Value
    ---            -----
    psobject       System.Management.Automation.PSObject
    pscustomobject System.Management.Automation.PSObject

并发现它们都引用了相同的PSObject类-这意味着使用加速器可以完成很多其他工作,而不仅仅是使代码更短。

关于这个问题,我的问题是:
  • 使用加速器和使用全名之间的区别有一些有趣的例子吗?
  • 只要可以使用加速器作为一般的最佳实践,是否应该避免使用全名?
  • 如何检查(也许使用反射)加速器是否执行其他操作而不只是指向基础类?
  • 最佳答案

    看一下静态方法:

    PS C:\> [PSCustomObject] | gm -Static -MemberType Method
    
    
    
       TypeName: System.Management.Automation.PSObject
    
    Name            MemberType Definition
    ----            ---------- ----------
    AsPSObject      Method     static psobject AsPSObject(System.Object obj)
    Equals          Method     static bool Equals(System.Object objA, System.Object objB)
    new             Method     psobject new(), psobject new(System.Object obj)
    ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object o...
    
    
    
    PS C:\> [System.Management.Automation.PSCustomObject] | gm -Static -MemberType Method
    
    
    
       TypeName: System.Management.Automation.PSCustomObject
    
    Name            MemberType Definition
    ----            ---------- ----------
    Equals          Method     static bool Equals(System.Object objA, System.Object objB)
    ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object o...
    

    类型加速器添加了两个新的静态方法。我怀疑它正在使用其中之一作为构造函数。

    关于PowerShell类型加速器: PSObject vs PSCustomObject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35894272/

    10-09 18:09