2010-05-28 12 views
15

में प्रारंभिकरण मैं List<int> like new List<int>{1,2,3,4,5}; प्रारंभ कर सकता हूं हालांकि List<T> में एक कन्स्ट्रक्टर नहीं है जो एक पैरामीटर स्वीकार करता है। इसलिए मैंने इसे डीबगर के माध्यम से चलाने की कोशिश की और ऐसा लगता है कि ऐड विधि को कॉल किया जा रहा है। तो संकलक कैसे जानता है कि प्रत्येक विधि को जोड़ने के लिए किस विधि को आमंत्रित करना है।सूची <int> सी # 3.5

यह एक मूर्ख सवाल हो सकता है लेकिन मैं थोड़ा उलझन में हूं।

धन्यवाद

उत्तर

9

हर प्रकार है कि विधि जोड़ें और लागू करता IEnumerable इस तरह से प्रारंभ किया जा सकता है। कंपाइलर बस आपके कोड को संकलित करता है जैसे कि आपने इस ऐड विधि का उपयोग किया था।

एक नज़र here

+2

काफी नहीं - इसे आईनेमरेबल को भी लागू करना है (और एड विधि में पैरामीटर होना चाहिए, और वहां एक सुलभ कन्स्ट्रक्टर होना चाहिए)। –

+0

बस इसे संपादित किया :) इसे पहले स्थान पर लिखना भूल गया :) –

2

new List{ 1, 2, 3, 4, 5 } बस वाक्यात्मक 'चीनी' है ले लो। कवर के तहत यह प्रत्येक आइटम के लिए Add विधि को कॉल करेगा।

+2

क्या डाउनवॉटर कृपया एक टिप्पणी छोड़ देगा। धन्यवाद। –

+0

हम्म, कोई भी सही उत्तर को कम करने के लिए मालिक नहीं है। काम पर लोकतंत्र! –

6

इस विधि को देखें।

public void CreateList() 
    { 
     List<int> list = new List<int> { 1, 2, 3, 4, 5 }; 
    } 

इस संकलन के बाद, MSIL आप देख सकते हैं के रूप में इस तरह दिखता है ..

.method public hidebysig instance void CreateList() cil managed 
{ 
    // Code size  50 (0x32) 
    .maxstack 2 
    .locals init ([0] class [mscorlib]System.Collections.Generic.List`1<int32> list, 
      [1] class [mscorlib]System.Collections.Generic.List`1<int32> '<>g__initLocal0') 
    IL_0000: nop 
    IL_0001: newobj  instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor() 
    IL_0006: stloc.1 
    IL_0007: ldloc.1 
    IL_0008: ldc.i4.1 
    IL_0009: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_000e: nop 
    IL_000f: ldloc.1 
    IL_0010: ldc.i4.2 
    IL_0011: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_0016: nop 
    IL_0017: ldloc.1 
    IL_0018: ldc.i4.3 
    IL_0019: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_001e: nop 
    IL_001f: ldloc.1 
    IL_0020: ldc.i4.4 
    IL_0021: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_0026: nop 
    IL_0027: ldloc.1 
    IL_0028: ldc.i4.5 
    IL_0029: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0) 
    IL_002e: nop 
    IL_002f: ldloc.1 
    IL_0030: stloc.0 
    IL_0031: ret 
} // end of method Program::CreateList 

, यह सिर्फ एक वाक्यात्मक चीनी है और संकलक जोड़ें के लगातार कॉल द्वारा intialization बदल देता है()।

8

यह एक संग्रह प्रारंभकर्ता है, C# 3.0 language feature। यह जरूरी है:

  • प्रकार IEnumerable को लागू करना चाहिए (हालांकि यह आरंभीकरण के लिए इस्तेमाल कभी नहीं किया है)
  • प्रकार कम से कम एक Add विधि

यह बस प्रत्येक शब्द के लिए Add प्रणाली को बुलाती होना आवश्यक है । यदि आप Add एकाधिक मान स्वीकार करते हैं, तो उदाहरण के लिए आप टुपल्स का भी उपयोग कर सकते हैं। प्रत्येक अवधि तो {key,value} है:

new Dictionary<int,string> {{1,"abc"},{2,"def"}}; 

लिए पहले से आरक्षित प्रकार के लिए इस का उपयोग करने का एक उदाहरण के लिए:

class Program 
{ 
    static void Main() 
    { 
     new Foo { 1, "abc", { 2, "def" } }; 
    } 
} 

class Foo : IEnumerable 
{ 
    public void Add(int a) { } 
    public void Add(string b) { } 
    public void Add(int a, string b) { } 
    // must implement this!! (but never called) 
    IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } 
} 
0

new List<int>{1,2,3,4,5} के रूप में सरणी प्रारंभ है, मैं इसे इस के बाद से मैं जादू द्वारा आंतरिक रूप से बाहर काम करता है सोचने के लिए पसंद करते हैं ऐसा होने पर प्रभाव नहीं पड़ सकता है। इसके बारे में सोचने के लिए, यह शायद मेटाडेटा में संग्रह में तत्व जोड़ने के लिए डिफ़ॉल्ट विधि को परिभाषित करता है जहां [] इंडेक्स द्वारा किया जाता है और IList लागू करने वाले Add विधि द्वारा किए जाते हैं।

+0

"सरणी प्रारंभिकरण" नहीं है - यह एक अलग विषय है जो बहुत अलग तरीके से काम करता है। और जैसा कि * होता है * यह 'IList पर भरोसा नहीं करता है।'जोड़ें' (लेकिन यह एक उचित supposition है)। –

+0

मेरा मतलब संग्रह प्रारंभ करना था, यह ओपी http://stackoverflow.com/questions/459652/why-do-c-collection-initializers-work-this-way के लिए भी सहायक हो सकता है – Bablo

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