2013-04-12 9 views
11

निम्न कार्य क्यों करता है?कॉन्स मल्टी-आयामी सरणी प्रारंभिक

class A 
{ 
    public int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; 

    static void Main(string[] args) 
    { 
    } 
} 

जबकि निम्नलिखित नहीं है?

class A 
{ 
    public const int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; 

    static void Main(string[] args) 
    { 
    } 
} 

यह नल के अलावा किसी भी अन्य को असाइन करने के लिए स्ट्रिंग के अलावा किसी कॉन्स्ट संदर्भ प्रकार की अनुमति नहीं देता है। चूंकि यह एक सरणी (संदर्भ) है, इसे शून्य (?) असाइन किया जाना चाहिए। अगर यह स्थिर और शून्य है तो इसे कैसे शुरू किया जाएगा?

उत्तर

14

अगर मुझे सही याद है तो यह सी # के भाषा डिजाइन का हिस्सा है। const उन वस्तुओं के लिए आरक्षित है जो उनकी सामग्री को संकलित-समय पर घटा सकते हैं, यानी पहले (दौरान) प्रोग्राम भी बनाया गया है और फिर चलाया जा सकता है। सी # में सभी सरणी रन-टाइम सरणी हैं (जब प्रोग्राम चलते हैं, तब तक उनकी लंबाई निर्धारित होती है) और इस प्रकार उन्हें const फ़ील्ड में नहीं बनाया जा सकता है। मुझे लगता है कि यह सी # की सीमा है, लेकिन इस तरह उन्होंने इसे करने का फैसला किया।

कारण संदर्भ प्रकार शून्य हो सकते हैं कि null एक स्थिर मूल्य है, जबकि आपका प्रारंभकर्ता (जो रन-टाइम पर बनाया गया है) नहीं है। null भाषा में बनाया गया है, इसलिए उस तर्क से इसका मूल्य हमेशा ज्ञात होता है, हर समय (और इस प्रकार, संकलन-समय संदर्भ प्रकारों के लिए उपयोग योग्य)।

संपादित करें:

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

public static int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; 
    ^Static Keyword 

आप की तरह उस तक पहुँच सकते (अगर यह class A में अब भी है):

A.i[0, 1] 

मुझे आशा है कि तुम बाहर में मदद करता है

अधिक जानने के लिए MSDN देखें: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true

EDITEDIT: आप कोड को स्थिर तालिका कीलक और कभी किसी को भी इसे बदल जाने के बाद इसे शुरू कर दिया गया है की जरूरत है, वहाँ उस उद्देश्य के लिए readonly कीवर्ड:

public static readonly int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } }; 
    ^Static ^Readonly Keywords 

ध्यान रखें, यह आपको उन स्लॉट में चीजों को फिर से असाइन करने से नहीं रोक पाएगा, लेकिन यह सी # के रूप में तय किया जा सकता है, संपत्ति बनाने या हर बार एक नई सरणी लौटने के लिए।

+0

मैं बस इतना कह सकता हूं वाह। यह मुझे सबसे स्पष्ट के अलावा, पूर्णांक की निरंतर तालिकाओं को बनाने के तरीकों को खोजने के लिए मजबूर कर रहा है। – user2255673

+0

@ user2255673 यदि आप C++'s 'const * const' जैसे कुछ ढूंढ रहे हैं तो आपको इसे C# में नहीं मिलेगा। –

+0

@ उपयोगकर्ता 2255673 हाँ, यह काफी दुर्भाग्यपूर्ण है। लेकिन, आप पूर्णांक की स्थिर सारणी बना सकते हैं और उन पर काम कर सकते हैं, मैंने आपको दिखाने के लिए अपना जवाब संपादित कर लिया है। –

3

यह काम नहीं करता है क्योंकि यह const कीवर्ड पर प्रतिबंध है।

MSDN से:

स्थिरांक कीवर्ड एक क्षेत्र या स्थानीय चर की घोषणा संशोधित करने के लिए प्रयोग किया जाता है। यह निर्दिष्ट करता है कि फ़ील्ड का मान या स्थानीय चर स्थिर है, जिसका अर्थ है कि इसे संशोधित नहीं किया जा सकता है।

एक निरंतर अभिव्यक्ति एक अभिव्यक्ति है जिसे संकलित समय पर पूरी तरह से मूल्यांकन किया जा सकता है।

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

+2

ध्यान दें कि केवल पढ़ने के लिए सरणी _reference_ केवल पढ़ा जाएगा। सामग्री अभी भी किसी भी व्यक्ति के लिए सूचकांक द्वारा उत्परिवर्तनीय है जिसके पास सरणी का संदर्भ है। –

+0

@DanBryan: वास्तव में –

2

कॉन्स्टेंट का संकलन समय पर मूल्यांकन किया जाता है। ऐरे संदर्भ प्रकार हैं, और संदर्भ प्रकार बनाने का एकमात्र तरीका new कीवर्ड (जो आपके कोड में निहित है) का उपयोग करना है।

new निरंतर अभिव्यक्ति में उपयोग नहीं किया जा सकता है, क्योंकि इसका संकलन समय पर मूल्यांकन नहीं किया जा सकता है।

एमएसडीएन देखें: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true

+1

ध्यान दें कि स्ट्रिंग्स एक चेतावनी हैं, क्योंकि तार संदर्भ प्रकार हैं, लेकिन अंतर्निहित आईएल कोड से उन्हें स्थिरांक के रूप में लोड करने के लिए विशेष रूप से बेक किया गया है। –

+0

दरअसल, मुझे शायद इसका उल्लेख करना चाहिए था। –

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