2013-07-11 5 views
6

मैं सी # सरणी पर पढ़ रहा हूं इसलिए मेरा प्रश्न प्रारंभ में सरणी पर है।सी # सरणी को घोषित करने और तत्काल करने का क्या अर्थ है?

वास्तव में एक सरणी घोषित करने का क्या अर्थ है? मुझे पता है कि आप प्रकार सरणी का एक चर घोषित करते हैं। जब मेरे पास निम्नलिखित है, तो वास्तव में क्या हो रहा है?

int[] values; 

क्या यह घोषित होने तक स्मृति में है? यदि नहीं तो यह कहां है? क्या सरणी वास्तव में यहां बनाई गई है?

तो मैं जाने के लिए और एक सरणी का दृष्टांत और जैसे कुछ मूल्यों के साथ यह आरंभ:

int[] values = new int[] { 1, 2, 3 }; 

यह वास्तव में जाने के लिए और अब सारिणी निर्मित करता है? मैंने पढ़ा है कि जब वे घोषित किए जाते हैं तो सरणी बनाई जाती हैं, अन्य कहते हैं कि जब वे तत्काल होते हैं तो सरणी बनाई जाती हैं। मैं अपनी शब्दावली सही करने की कोशिश कर रहा हूं।

वही एक पूर्णांक चर के लिए जाता है। अगर मैं है:

int value; 

और

int value = 1; 

जब पूर्णांक बनाई गई है? इसे स्मृति में कब जोड़ा जाता है?

गूंगा प्रश्नों के लिए खेद है। मैं अवधारणा को समझता हूं लेकिन सरणी के दृश्यों के पीछे तकनीकीता जानना चाहता हूं।

उत्तर

6

वास्तव में एक सरणी घोषित करने का क्या अर्थ है?

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

ही एक पूर्णांक चर

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

यदि यह वास्तव में कक्षा का सदस्य है तो क्लास ऑब्जेक्ट बनने पर यह बनाया जाता है। नया कीवर्ड के साथ जीसी ढेर पर एक सरणी की तरह।

+1

यदि आप इसे शाब्दिक रूप से लेते हैं, तो 'नया' कीवर्ड को सरणी ऑब्जेक्ट बनाने की आवश्यकता नहीं है , आप 'int [] मान = {1, 2, 3} जैसे कुछ भी लिख सकते हैं; '। हालांकि आप इस बात पर विचार कर सकते हैं कि 'नया' के साथ पूर्ण वाक्यविन्यास के लिए सिर्फ एक शॉर्टकट होना चाहिए। – svick

+0

@ हंस: क्या एक सरणी संदर्भ घोषित करना कोई स्मृति लेता है? या केवल जब सरणी बनाई जाती है? –

+0

यह एक सूचक का आकार करता है। 32-बिट प्रक्रिया में 4 बाइट्स, 64-बिट प्रक्रिया में 8 बाइट्स। संदर्भ के लिए संग्रहण एक मान प्रकार मान के लिए समान नियमों का पालन करता है। –

1
int[] values; 

मतलब है कि आप प्रकार int का एक चर घोषित करते हैं []। अभी तक कोई स्मृति नहीं है, केवल एक संदर्भ बनाया गया है। उपरोक्त कोड को शून्य-संदर्भ में प्रारंभ किया गया है।

int[] values = new int[] { 1, 2, 3 }; 

यह कोड प्रकार int [] का एक चर घोषित करता है, और तुरंत एक सरणी बनाता है। परिवर्तनीय नव निर्मित सरणी संदर्भित करता है।

इंटीग्रर्स मूल्य-प्रकार के बाद से थोड़ा अलग काम करते हैं। पूर्णांक के मामले में मान प्रकारों को उनके डिफ़ॉल्ट मानों में प्रारंभ किया जाता है, मान 0.

यदि आप घोषणा और प्रारंभिक विभाजन को विभाजित करते हैं, तो निम्न होता है।

// This declares a variable 
int[] values; 
// This creates the array, and initializes the variable with the newly created array. 
values = new int[] { 1, 2, 3 }; 
+1

यदि आप एक प्रकार के सदस्य हैं, और जब उस प्रकार का एक उदाहरण बनाया गया है, तो आप केवल 'int []' के लिए एक शून्य संदर्भ बनाते हैं। यदि आप इसे किसी विधि के अंदर करते हैं तो आपके पास तब तक कोई संदर्भ नहीं है जब तक आप इसे प्रारंभ नहीं करते। – Renan

+0

@ रेनान मुझे यकीन नहीं है कि आपका क्या मतलब है। शून्य संदर्भ किसी भी प्रकार का सदस्य नहीं है (http://ericlippert.com/2013/05/30/what-the-meaning-of-is-is/)। – Maarten

+0

"अभी तक कोई स्मृति नहीं है, केवल एक संदर्भ बनाया गया है।" क्या आप एक संदर्भ कह रहे हैं कि कोई स्मृति नहीं है? – svick

1

जब आप एक सरणी की घोषणा, आंतरिक रूप से सभी की जाती है कि बनाया जा रहा एक अशक्त सूचक प्रकार int[] की है। जब आप अपने उदाहरण में new कीवर्ड का उपयोग करते हैं, या आप उस समय new int[6] का उपयोग करते हैं, उस समय सिस्टम सरणी के आकार के लिए स्मृति आवंटित करता है।

की घोषणा एक int वास्तव में 0.

+1

सी # वही व्यवहार करता है, क्योंकि 'int' एक मान प्रकार है, यहां देखें: http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx।उद्धरण: * संदर्भ प्रकारों के विपरीत, एक मान प्रकार में शून्य मान नहीं हो सकता है। (...) प्रत्येक मान प्रकार में एक निहित डिफ़ॉल्ट कन्स्ट्रक्टर होता है जो उस प्रकार के डिफ़ॉल्ट मान को प्रारंभ करता है। * – Treb

+0

आपका दूसरा पैराग्राफ गलत है। int एक मान प्रकार है जो शून्य पर डिफ़ॉल्ट होता है। इसे आज़माएं: 'शून्य मुख्य() {कंसोल। राइटलाइन (नया एक्स()। I);} कक्षा एक्स {सार्वजनिक int i;}' – spender

+0

सुधार के लिए धन्यवाद। मैंने सोचा कि मैंने कहीं पढ़ा है कि 'int'' Int32' या कुछ के लिए उपनाम था। – Samuel

1

का डिफ़ॉल्ट मान के साथ पूर्णांक के लिए स्मृति पैदा करेगा जब आप इसे इस तरह की घोषणा:

int[] values; 

आप आकार निर्दिष्ट नहीं है, इसलिए नहीं है यह जानने का कोई तरीका नहीं है कि एक उत्पीड़न के लिए कितनी मेमोरी की आवश्यकता होगी।यह जानकारी केवल निम्न पंक्ति में दिया जाता है:

values = new int[] { 1, 2, 3 }; 

स्मृति आवश्यकताओं instatiation मानों की संख्या (और प्रकार int की स्मृति आवश्यकताओं, निश्चित रूप से से) से निष्कर्ष निकाला गया है।

आप इस तरह एक पूर्णांक की घोषणा कब:

int value; 

स्मृति आवश्यकताओं जाना जाता है और नहीं बदल सकते हैं (क्योंकि int एक मूल्य के प्रकार है)। यह चर (और इच्छा) तुरंत बनाया जा सकता है। यदि आप प्रारंभिक मान निर्दिष्ट नहीं करते हैं, तो इसका डिफ़ॉल्ट मान होगा, जो int0 है।

+0

क्या आप कह रहे हैं कि यदि आप केवल 'int [] मान' लिखते हैं, तो उस * चर * के लिए स्मृति आवंटित नहीं की जाती है? यह गलत है, क्योंकि उस चर के संदर्भ में एक संदर्भ और स्मृति है * आवंटित है। – svick

+0

इसके अलावा, स्थानीय चर के डिफ़ॉल्ट मानों के बारे में बात करना समझ में नहीं आता है, उनके पास कोई नहीं है। उदाहरण के लिए, आप 'int i' नहीं लिख सकते हैं; Console.WriteLine (i); '। – svick

+0

@svick: आपकी टिप्पणी संख्या 1: मैंने स्वयं को स्पष्ट रूप से पर्याप्त रूप से व्यक्त नहीं किया, मेरा मतलब था कि सरणी ** के लिए स्मृति ** आवंटित नहीं है। आपकी टिप्पणी संख्या 2: 'int', सभी मान प्रकारों की तरह, * * एक डिफ़ॉल्ट मान है। सी # कंपाइलर आपको एक वैरिएबल ** का उपयोग करने की अनुमति नहीं देता है ** आपने ** पहले शुरू नहीं किया है, यह सही है। लेकिन आपके उदाहरण में 'i' ** स्वचालित रूप से ** इसके डिफ़ॉल्ट मान के लिए प्रारंभ किया गया है, यानी 0. उदाहरण के लिए आप इसे डीबगर में देख सकते हैं। 'कंसोल। राइटलाइन (i);' कंसोल के साथ बदलें। राइटलाइन ("ब्लै"); ', उस लाइन पर ब्रेकपॉइंट सेट करें और 'i' का निरीक्षण करें, आप देखेंगे कि इसका मान 0 है। – Treb

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