12

PowerShell v3.0 PSCustomObject में पेश किया गया था। यह PSObject जैसा है, लेकिन बेहतर है। अन्य सुधार (जैसे संपत्ति आदेश संरक्षित किया जा रहा), hashtable से वस्तु बनाने के अलावा सरल है:पावरशेल प्रकार त्वरक: PSObject बनाम PSCustomObject

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

अब यह स्पष्ट है कि इस बयान लगता है:

[System.Management.Automation.PSCustomObject]@{one=1; two=2;} 

उसी तरह काम करेगा, क्योंकि PSCustomObject एक है पूर्ण नामस्थान + वर्ग नाम के लिए "उपनाम"। इसके बजाय मैं एक त्रुटि मिलती है:

Cannot convert the "System.Collections.Hashtable" value of type "System.Collections.Hashtable" to type "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 वर्ग - इसका मतलब यह है कि त्वरक का उपयोग कर एक गुच्छा कर सकते हैं है कोड को छोटा बनाने की तुलना में अन्य सामानों का।

इस मुद्दे के बारे में मेरे सवाल कर रहे हैं:

  1. एक त्वरक पूर्ण प्रकार नाम का उपयोग कर बनाम का उपयोग कर के बीच आप मतभेदों में से कुछ दिलचस्प examaples है?
  2. जब भी एक त्वरक सामान्य सर्वोत्तम अभ्यास के रूप में उपलब्ध होता है तो पूर्ण प्रकार के नाम का उपयोग करना चाहिए?
  3. कैसे जांचें, शायद प्रतिबिंब का उपयोग करके, अगर एक त्वरक केवल अंतर्निहित वर्ग की ओर इशारा करते हुए अन्य सामान करता है? स्थिर तरीकों पर
+4

यदि आप 'System.Management.Automation.Language.Compiler को संकुचित करते हैं।VisitConvertExpression', तो आप देख सकते हैं कि तीन प्रकार के नामों के लिए विशेष हैंडलिंग हैं: 'आदेश दिया गया', 'PSCustomObject' और' ref'। – PetSerAl

उत्तर

5

देख रहे हैं:

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... 

प्रकार त्वरक नया स्थिर तरीकों में से एक जोड़े को जोड़ा है। मुझे संदेह है कि यह उनमें से एक को कन्स्ट्रक्टर के रूप में उपयोग कर रहा है।

2

[PSObject] और [PSCustomObject] एक ही प्रकार के लिए उपनाम हैं - System.Management.Automation.PSObject। मैं नहीं कह सकता कि इसके लिए एक अच्छा कारण है, लेकिन कम से कम दो अलग-अलग उद्देश्यों का सुझाव है, और शायद यही कारण है।

सिस्टम। प्रबंधन .ऑटोमेशन .PSObject वस्तुओं को लपेटने के लिए उपयोग किया जाता है। इसे किसी भी ऑब्जेक्ट पर एक सामान्य प्रतिबिंब एपीआई प्रदान करने के लिए पेश किया गया था जो पावरशेल लपेटता है - नेट, डब्लूएमआई, कॉम, एडीएसआई, या साधारण संपत्ति बैग।

सिस्टम। प्रबंधन .ऑटोमेशन .PSCustomObject केवल एक कार्यान्वयन विस्तार है। जब आप एक PSObject बनाते हैं, तो PSObject को कुछ लपेटना चाहिए। संपत्ति बैग के लिए, लपेटा गया ऑब्जेक्ट सिस्टम है। प्रबंधन .ऑटोमेशन .PSCustomObject.SelfInstance (एक आंतरिक सदस्य।) यह उदाहरण PowerShell के सामान्य उपयोग से छिपा हुआ है, इसे देखने का एकमात्र तरीका प्रतिबिंब के साथ है।

संपत्ति बैग PowerShell में कई मायनों में बनाई गई हैं:

$o1 = [pscustomobject]@{Prop1 = 42} 
$o2 = new-object psobject -Property @{Prop1 = 42 } 

दोनों $ O1 और $ ऊपर O2 PSObject का एक उदाहरण हो जाएगा, और PSObject PSCustomObject.SelfInstance लपेट होगा। PSCustomObject.SelfInstance को एक साधारण संपत्ति बैग के बीच अंतर और किसी भी अन्य वस्तु को लपेटने के लिए PowerShell में आंतरिक रूप से उपयोग किया जाता है।

+0

हाय जेसन। PSObject के बजाय PSCustomObject के उदाहरणों के रूप में 'गेट-सदस्य' और '.GetType()' दोनों $ o1 और $ o2 दोनों रिपोर्ट करते हैं। –

+0

यदि, हालांकि मैं तीसरा ऑब्जेक्ट '$ o3 = [psobject] @ {Prop1 = 42}' के रूप में बनाता हूं, तो वह ऑब्जेक्ट अलग है। –

+1

मेरा मुद्दा यह है कि उपरोक्त उत्तर भ्रमित है, क्योंकि शक्तियों में '[psobject] 'और' [pscustomobject]' निश्चित रूप से ऐसा नहीं करते हैं। –

संबंधित मुद्दे