2012-09-21 11 views
6

में मैंने अभी इनमें से एक "क्या ..." क्षणों में से एक था। क्या निम्नलिखित का इरादा है और क्या सी # में सरणी की "गैर-प्राकृतिक" घोषणा के पीछे कुछ अस्पष्ट तर्क है?सी # jagged सरणी प्रकार की घोषणा रिवर्स

int[,][] i; // declares an 2D - array where each element is an int[] ! 
// you have to use it like this: 
i = new int[2,3][]; 
i[1,2] = new int[0]; 

मैं अन्य तरीकों से अपेक्षा करता। int [,] [] एक 1-आयामी सरणी घोषित करता है जहां प्रत्येक तत्व दो आयामी सरणी है।

अजीब बात है, हालांकि, इस किस्म के नाम उल्टा होता है:

Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]" 

कोई इस व्याख्या कर सकते हैं? क्या यह जानबूझकर है? (विंडोज़ के तहत .NET 4.5 का उपयोग करना।)

उत्तर

7

आप एरिक लिपर्ट्स ब्लॉग Arrays of arrays में एक लंबी चर्चा पा सकते हैं।

क्या सी # वास्तव में

करता है यह एक गड़बड़ है। कोई फर्क नहीं पड़ता कि हम कौन सा विकल्प चुनते हैं, कुछ अंतर्ज्ञान हमारे अंतर्ज्ञान से मेल नहीं खाता है। यहां हमने वास्तव में सी # में क्या चुना है।

पहला बंद: विकल्प दो [यह एक द्वि-आयामी सरणी है, प्रत्येक तत्व इंट्स की एक-आयामी सरणी है] सही है। हम आपको परिणामस्वरूप एक द्वारा अजीबता के साथ रहने के लिए मजबूर करते हैं; आप वास्तव में तत्व प्रकार को सरणी विनिर्देशक जोड़कर उस प्रकार की सरणी में नहीं बनाते हैं। आप मौजूदा सरणी विनिर्देशों की सूची में निर्दिष्ट को प्रीपेड करके एक सरणी प्रकार में बनाते हैं। पागल लेकिन सच है।

'प्रीपेन्डिंग' शब्द आंशिक रूप से उल्टा प्रकार के नाम के आपके आउटपुट को बताता है। एक सीएलआर प्रकार का नाम सी # घोषणा के समान नहीं है।

लेकिन अधिक प्रासंगिक उद्धरण नीचे स्थित है:

सभी ने कहा कि, बहुआयामी प्रचंड सरणियों लगभग निश्चित रूप से एक बुरी कोड गंध है।

+0

लिंक के लिए धन्यवाद। यह सब कुछ बताता है। मैं पूरी तरह से अपने तर्क से असहमत हूं कि "समझदार" क्या है, लेकिन यह एक और विषय है। कम से कम अब मुझे पता है कि किसी ने इस बारे में सोचा और कुछ सचेत (लेकिन अजीब) निर्णय लिया। (शायद ऐसा इसलिए है क्योंकि मैं जर्मन हूं और 24 "चौबीसवीं" के रूप में वर्तनी करने के लिए प्रयोग किया जाता है: डी) – Imi

0

मैं एक ही था "क्या ..." पल पहली बार मैं new int[5][]; बजाय new int[][5]; देखा।

ईएल के (बहुत अच्छा) ब्लॉग पोस्ट के आसपास एक बात नृत्य है: वहाँ एक ComSci डिग्री साथ लोगों के लिए यह करने के लिए एक बढ़िया तरीका है, लेकिन कोई अच्छा तरीका दूसरों के लिए यह करने के लिए है। तुम सिर्फ व्याकरण का पालन करें, तो आप घोषित दाएँ-से-बाएँ, new दाएँ-से-बाएँ और सूचकांक बाएँ-से-दाएँ:

// 1D array of 2D arrays, no special rules needed: 
int[,][] N; N=new[,][5]; N[0]=new int[4,4]; 

लेकिन सी # के लक्षित दर्शकों के 4 साल सीएस डिग्री के साथ लोगों को नहीं है (जिन्होंने सभी को रिवर्स पोलिश और दाएं से बाएं प्यार देखा है।) चाल, आईएमएचओ, सी # जंजीर सरणी को समझने में है कि उन्होंने उनके लिए विशेष नियम बनाने का फैसला किया, जब उन्हें तकनीकी रूप से आवश्यकता नहीं थी।