2017-06-08 15 views
5

में कुछ सरणी एक-दूसरे को दर्पण क्यों करते हैं मैं पावरहेल 2.0 का उपयोग कर रहा हूं। जब मैं एक सरणी के रूप में एक नया चर बना देता हूं और फिर किसी अन्य चर को पहले के बराबर के रूप में सेट करता हूं, तो दूसरा चर "दर्पण" पहला होता है। मूल सरणी में किसी ऑब्जेक्ट को बदलने के बाद, दूसरी सरणी में सटीक वही परिवर्तन दिखाई देता है। उदाहरण के लिए,पावरहेल

$array0001=6,7,3,4,0 
$array0002=$array0001 
$array0001[3]=55 
$array0002 
उत्पादन के साथ

जा रहा है

6 
7 
3 
55 
0 

मैं इस बार एक उपसूचक ऑपरेटर के भीतर संलग्न को छोड़कर, पहले चर के रूप में एक ही मूल्य है करने के लिए है कि जब आप दूसरे चर सेट नोटिस, संशोधन पहली सरणी में दूसरी सरणी को प्रभावित नहीं करते हैं। उदाहरण के लिए,

$array0001=6,7,3,4,0 
$array0002=$($array0001) 
$array0001[3]=55 
$array0002 

उत्पादन किया जा रहा है

6 
7 
3 
4 
0 

क्यों एक उपसूचक ऑपरेटर बदलने में चर के व्यवहार मूल्य संलग्न करता है के साथ के लिए? सरणी चर बनाने से बचने के लिए कोई अन्य या बेहतर तरीका है जो एक-दूसरे को "दर्पण" करता है?

ईटीए: अब मुझे पता चला है कि [email protected]($array0001) और $array0002=&{$array0001} दोनों एक ही उद्देश्य को पूरा करते हैं।

उत्तर

7

इसे "संदर्भ द्वारा पास" कहा जाता है। वास्तव में एक मान निर्दिष्ट करने के बजाय, आप किसी अन्य स्थान का संदर्भ निर्दिष्ट कर रहे हैं जिसमें मूल्य है। यदि मूल स्थान में मान बदलता है, तो आपके द्वारा किए गए संदर्भ उस मूल स्थान पर इंगित कर रहे हैं, और अपडेट किए गए मान को देखेंगे।

अधिकांश भाषाओं में "संदर्भ द्वारा पास" और "मूल्य से गुजरने" के तरीके हैं। $array0002=$($array0001) करके आपको यही मिला। कोई भी दूसरे की तुलना में बेहतर नहीं है, वे दोनों के पास अलग-अलग उपयोग हैं।

पावरशेल में आप संदर्भ के बजाय मूल्य को पकड़ने के लिए अपने संदर्भ के पीछे .value डाल सकते हैं।

2

एक सरणी को दूसरे के बराबर सेट करते समय, अलग-अलग चर बस एक-दूसरे का संदर्भ दे रहे हैं, यह एक वास्तविक प्रति नहीं है। This अनिवार्य रूप से वही बात है जिसे आप पूछ रहे हैं। उस लिंक से, गहरी प्रतिलिपि करने के लिए डेटा को क्रमबद्ध करना इसके चारों ओर एक अच्छा तरीका है।

#Original data 
$Array1 

# Serialize and Deserialize data using BinaryFormatter 
$ms = New-Object System.IO.MemoryStream 
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
$bf.Serialize($ms, $Array1) 
$ms.Position = 0 

#Deep copied data 
$Array2 = $bf.Deserialize($ms) 
$ms.Close()