2010-06-23 15 views
44

मान लें कि मेरे पास एक फ़ंक्शन है:यदि मैं आकार 0 के लिए सरणी प्रारंभ करता हूं तो क्या होता है?

void myFunc(List<AClass> theList) 
{ 
    string[] stuff = new string[theList.Count]; 
} 

और मैं एक खाली सूची में जाता हूं।

क्या सामान एक शून्य सूचक होगा? या यह स्मृति में कुछ यादृच्छिक जगह के लिए एक सूचक होगा जो अनियमित है?

+1

यह बहुत उपयोगी है जब आपको रिक्त आईन्यूमेरेबल (आमतौर पर परीक्षण के लिए) – Skurmedel

+6

'संख्यात्मक। लक्षण <...> 'बेहतर है। –

उत्तर

65

यह एक खाली सरणी वस्तु बना देगा। यह अभी भी एक पूरी तरह से मान्य वस्तु है - और एक जो स्मृति में एक शून्य राशि की जगह लेता है। यह अभी भी अपने स्वयं के प्रकार, और गिनती को जानता होगा - इसमें कोई तत्व नहीं होगा।

खाली सरणी अक्सर अपरिवर्तनीय खाली संग्रह के रूप में उपयोग करने के लिए उपयोगी होती हैं: आप उन्हें विज्ञापन infinitum का पुन: उपयोग कर सकते हैं; सरणी निहित रूप से परिवर्तनीय हैं, लेकिन केवल तत्व के संदर्भ में ... और यहां हमारे पास बदलने के लिए कोई तत्व नहीं है! चूंकि सरणी आकार बदलने योग्य नहीं हैं, एक खाली सरणी पूरी तरह से अपरिवर्तनीय है।

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

public static class Arrays<T> 
{ 
    private static readonly T[] empty = new T[0]; 

    public static readonly T[] Empty { get { return empty; } } 
} 

तो फिर तुम बस का उपयोग कर सकते हैं:

return Arrays<string>.Empty; 

(या जो कुछ भी) जब आप के एक खाली सरणी के लिए एक संदर्भ उपयोग करने की आवश्यकता एक विशेष प्रकार।

+0

जिस बिंदु पर मैं उलझन में था, वह यह था कि एक खाली सरणी एक गैर-शून्य राशि की जगह लेती है, जैसा कि आप इसे कहते हैं। – samoz

+2

क्योंकि इसकी 'खालीता' के बारे में जानकारी कहीं भी संग्रहीत की जानी है (यानी गिनती) इसे कुछ जगह लेनी है। मैंने जो जवाब दिया है, उसे देखते हुए, आप निश्चित रूप से (लेकिन यह खतरनाक हो सकता है) आंतरिक गाइडलाइन है कि लंबाई 0 के सरणी शुरू करने के बजाय आप संदर्भ को शून्य सेट करते हैं। लेकिन जब इस तरह के सरणी का उपयोग किया जाता है और स्लिम स्पेस बचत के लायक नहीं होने पर इसे कुछ अतिरिक्त चेक की आवश्यकता हो सकती है। –

+0

मुझे अभी भी यह समझ में नहीं आता कि आप कभी भी 'नया int [0];' जैसे कुछ चाहते हैं। मैं नहीं देखता कि यह अपने अपरिवर्तनीय के बाद से किसी भी उपयोगी उद्देश्य को कैसे पेश करता है। – Kcvin

3

stuffdefault(string) के लिए शुरू लंबाई theList.Count साथ एक सरणी सभी प्रविष्टियों के साथ है, जो null है के लिए एक संदर्भ हो जाएगा।

+1

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

+4

इस मामले में यह लंबाई 0 के साथ एक सरणी का संदर्भ होगा जिसमें सभी 0 प्रविष्टियां शून्य हो गई हैं। ;) – dahlbyk

10

ऐसा क्यों होना चाहिए? यह सिर्फ आकार 0 की सरणी को इंगित करेगा, जो पूरी तरह मान्य है।

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

+1

"दोनों डेटा की अनुपस्थिति को इंगित करते हैं और ऐसी अनुपस्थिति को इंगित करने का कोई सही या गलत तरीका नहीं है।" लेकिन अवधारणात्मक रूप से, आमतौर पर दोनों के बीच एक अंतर होता है। यह एक खाली कार्डबोर्ड बॉक्स रखने और बिल्कुल एक बॉक्स नहीं होने के बीच अंतर की तरह है। (मुझे आशा है कि मुझे डेटाबेस के साथ कभी भी काम नहीं करना पड़ेगा जहां "== नल, क्योंकि मैं उसमें काफी उलझन में हूं।) – JAB

+0

ओरेकल अनुपूरक रूप से करता है। मैं इसके साथ 100% सहमत नहीं हूं, क्योंकि टेरीरी लॉजिक (IS NULL बनाम = NULL) है। –

+3

NULL == "" एक बुरा ओरेकल "फीचर है" - कोई सायन सिस्टम आमतौर पर उन्हें बराबर के रूप में नहीं मानना ​​चाहिए। मेरी राय ... ^^ –

0

तो theList एक वास्तविक List वस्तु है, और केवल खाली है, तो theList.Count 0. वापस जाने के लिए इसका मतलब है (की घोषणा

string[] stuff = new string[0]; 

दूसरे शब्दों में, stuff हो जाता है सिर्फ एक सरणी हो जाएगा जा रहा है स्ट्रिंग्स) लंबाई 0.

+1

नहीं, सामान तारों की एक खाली सरणी होगी, खाली स्ट्रिंग नहीं। –

+0

मुझे यकीन है कि सामान तारों की एक सरणी है, स्ट्रिंग नहीं !? –

+1

@Eric: मुझे पता है, मुझे 'char' के साथ मिश्रित 'स्ट्रिंग' मिला है और सी/सी ++ शब्दों में सोच रहा था (सोच रहा है कि बहुत तेज़ हमेशा मेरी विफलताओं में से एक रहा है)। इससे पहले कि मैंने आपकी टिप्पणी भी देखी, मेरे जवाब को सही किया। – JAB

5

यह ठीक कोड है। आपको शून्य वस्तुओं (आवंटन) के साथ एक ऐरे ऑब्जेक्ट मिलेगा।

2

निम्नलिखित सी # भाषा विनिर्देश में है:

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

तो शून्य की लंबाई के लिए, स्मृति आवंटित किया जाता है।

0

जब तक आप सुनिश्चित रूप में है कि अपनी सूची <> कि आप वास्तव में विधि करने के लिए पारित कहीं सूची प्रारंभ किया गया था की तरह

List<Stuff> myStuff = new List<Stuff>; 

, नहीं शून्य पर इशारा करते हैं। यह शून्य सामग्री की एक सूची होगी।

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

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