2010-03-31 9 views
6

System.Array सामान्य भाषा रनटाइम (सीएलआर) में सभी सरणी के लिए बेस क्लास के रूप में कार्य करता है। this article के अनुसार: Get/Set/Address:,बहुआयामी प्रणाली के लिए गेट, सेट और पता विधियों पर मुझे जानकारी कहां मिल सकती है। .NET में आरे उदाहरण?

प्रत्येक ठोस सरणी प्रकार के लिए [यह] क्रम तीन विशेष तरीकों कहते हैं।

और वास्तव में अगर मैं इस सी # कोड,

int[,] x = new int[1024,1024]; 
x[0,0] = 1; 
x[1,1] = 2; 
x[2,2] = 3; 
Console.WriteLine(x[0,0]); 
Console.WriteLine(x[1,1]); 
Console.WriteLine(x[2,2]); 
सीआईएल मैं में

,

IL_0000: ldc.i4  0x400 
IL_0005: ldc.i4  0x400 
IL_000a: newobj  instance void int32[0...,0...]::.ctor(int32, 
                 int32) 
IL_000f: stloc.0 
IL_0010: ldloc.0 
IL_0011: ldc.i4.0 
IL_0012: ldc.i4.0 
IL_0013: ldc.i4.1 
IL_0014: call  instance void int32[0...,0...]::Set(int32, 
                 int32, 
                 int32) 
IL_0019: ldloc.0 
IL_001a: ldc.i4.1 
IL_001b: ldc.i4.1 
IL_001c: ldc.i4.2 
IL_001d: call  instance void int32[0...,0...]::Set(int32, 
                 int32, 
                 int32) 
IL_0022: ldloc.0 
IL_0023: ldc.i4.2 
IL_0024: ldc.i4.2 
IL_0025: ldc.i4.3 
IL_0026: call  instance void int32[0...,0...]::Set(int32, 
                 int32, 
                 int32) 
IL_002b: ldloc.0 
IL_002c: ldc.i4.0 
IL_002d: ldc.i4.0 
IL_002e: call  instance int32 int32[0...,0...]::Get(int32, 
                 int32) 
IL_0033: call  void [mscorlib]System.Console::WriteLine(int32) 
IL_0038: ldloc.0 
IL_0039: ldc.i4.1 
IL_003a: ldc.i4.1 
IL_003b: call  instance int32 int32[0...,0...]::Get(int32, 
                 int32) 
IL_0040: call  void [mscorlib]System.Console::WriteLine(int32) 
IL_0045: ldloc.0 
IL_0046: ldc.i4.2 
IL_0047: ldc.i4.2 
IL_0048: call  instance int32 int32[0...,0...]::Get(int32, 
                 int32) 
IL_004d: call  void [mscorlib]System.Console::WriteLine(int32) 

जहां उपर्युक्त Get और Set तरीकों के लिए कॉल स्पष्ट रूप से देखा जा सकता है एकत्रित न। ऐसा लगता है कि इन तरीकों की धैर्य सरणी की आयामता से संबंधित है, जो संभवत: रनटाइम द्वारा बनाई गई हैं और पूर्व-घोषित नहीं हैं। मैं एमएसडीएन पर इन विधियों के बारे में किसी भी जानकारी का पता नहीं लगा सका और उनके सरल नाम उन्हें गूगलिंग के लिए प्रतिरोधी बनाते हैं। मैं एक भाषा के लिए एक कंपाइलर लिख रहा हूं जो बहुआयामी सरणी का समर्थन करता है, इसलिए मैं इन विधियों के बारे में कुछ आधिकारिक दस्तावेज ढूंढना चाहता हूं, जिसके तहत मैं उन्हें किस स्थिति में अस्तित्व में रख सकता हूं और मैं उनके हस्ताक्षर क्या उम्मीद कर सकता हूं।

विशेष रूप से, मैं, चाहे इसके संभावित एक उदाहरण बनाने के लिए सही प्रकार और आयामी स्वरूप जिस पर प्रतिबिंबित करने के लिए के साथ सरणी के बिना Get या SetReflection.Emit साथ प्रयोग के लिए के लिए एक MethodInfo वस्तु पाने के लिए जानना चाहते हैं जैसा कि जुड़ा हुआ उदाहरण में किया जाता है।

+0

@Rob: क्या आपके पास 'पता' विधि के लिए एक उदाहरण है? और क्या आपके पास इस तथ्य का वर्णन करने वाला एक लिंक है कि ये विधियां उत्पन्न की गई हैं? –

+0

@ जॉन - यदि आप मेरे शुरुआती पैराग्राफ में 'इस आलेख' लिंक पर क्लिक करते हैं तो आप उस आलेख पर समाप्त हो जाएंगे, जिसमें से दूसरे पैराग्राफ में उद्धरण लिया गया है। –

उत्तर

5

देखो, विशेष रूप से पृष्ठों 63-65

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20II.pdf

लेकिन टेकअवे, और आप आईएल से बता सकते हैं पर खंड 14.2, कि वे सरणियों से निपटने के लिए मनुष्य और सेटर तरीके रहे है दिए गए सूचकांक पदों पर।

• एक प्राप्त विधि है कि int32 तर्क, सरणी के प्रत्येक आयाम के लिए एक के एक दृश्य लेता है, और एक मूल्य जिसका प्रकार सरणी के तत्व प्रकार है रिटर्न

। को इस विधि का उपयोग के विशिष्ट तत्व तक पहुंचने के लिए किया जाता है जहां तर्क प्रत्येक आयाम में सूचकांक निर्दिष्ट करते हैं, से पहले तत्व के पहले, होने के बाद।

• एक सेट विधि है कि int32 तर्क, सरणी के प्रत्येक आयाम के लिए एक के अनुक्रम लेता है, एक मूल्य जिसका प्रकार के बाद सरणी के तत्व प्रकार है। सेट का वापसी प्रकार शून्य है।इस विधि सेट करने के लिए तत्व की पहली सरणी के एक विशिष्ट तत्व जहां तर्क प्रत्येक आयाम में सूचकांक निर्दिष्ट करते हैं, के साथ शुरुआत स्थापित करने के लिए प्रयोग किया जाता है और अंतिम तर्क मूल्य में संग्रहीत करने के लिए निर्दिष्ट करता है लक्ष्य तत्व

• एक पता विधि है कि के लिए सरणी के प्रत्येक आयाम int32 तर्कों की अनुक्रम लेता है, एक है, और एक वापसी प्रकार एक प्रबंधित सूचक सरणी के तत्व प्रकार है कि है

। यह विधि है, जहां तर्क प्रत्येक आयाम में सूचकांक निर्दिष्ट सरणी के किसी विशिष्ट तत्व किसी प्रबंधित सूचक वापस जाने के लिए, तत्व जिसका पता लौटे किया जा रहा है की पहली साथ शुरुआत प्रयोग किया जाता है।

संपादित करें: कि के पृष्ठों 63-65 दस्तावेज़ के पेज नंबर का उपयोग कर। वास्तविक पीडीएफ में 73-75।

+0

बढ़िया! यही वही है जो मैं ढूंढ रहा था। धन्यवाद। –

1

मुझे यकीन नहीं है कि यह आपके विशिष्ट प्रश्न को संबोधित करेगा, लेकिन इस विषय पर एक महान पाठ (दूसरों के बीच) CLR via C# है। यह आपकी रुचि रखने वाले कई विषयों के लिए बहुत गहराई से हो जाता है और कई आधारों के आंतरिक कार्यों को देखकर डिस्सेबलर के साथ बहुत समय बिताता है .NET सहित सरणी। निश्चित रूप से जांचने लायक है। यहाँ

+0

मुझे सी # के माध्यम से सीएलआर देखने के लिए याद दिलाने के लिए धन्यवाद, जो मेरे पास है। मैं सिर्फ अध्याय 13: Arrays के माध्यम से पढ़ता हूं लेकिन मुझे गेट, सेट और पता विधियों का कोई उल्लेख नहीं दिख रहा है। –

2

अपने दूसरे प्रश्न का उत्तर देने के लिए, आपको इन विधियों के लिए MethodInfo प्राप्त करने के लिए कोई उदाहरण बनाने की आवश्यकता नहीं है।

var mi = typeof(string).MakeArrayType(6).GetMethod("Get"); 

की तरह कुछ string[,,,,,] प्रकार के लिए Get विधि प्राप्त करने के लिए काम करेंगे।

+0

शानदार! अब मेरे पास सब कुछ है जिसके लिए मैं आया था। –

+1

मुझे बाद में पता चला है कि MakeArrayType के ओवरलोड के बीच चयन करते समय देखभाल की आवश्यकता होती है। कोई तर्क नहीं के साथ - MakeArrayType() स्ट्रिंग [] जैसे वेक्टर प्रकार बनाता है। एक के तर्क के साथ - MakeArrayType (1) एक आयाम प्रकार स्ट्रिंग [*] के साथ एक बहुआयामी सरणी बनाता है। ये प्रकार संगत नहीं हैं। अन्य .NET भाषाओं के साथ अंतःक्रियाशीलता के लिए इसका मतलब है कि जब रैंक == 1 आपको विशेष-मामले को पैरामीटर रहित विधि पर कॉल करने की आवश्यकता होगी। –

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

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