2011-01-14 19 views
5

नीचे स्निपेट मुझे रचनाकारों और एक प्रकार के तरीकों की एक सूची देता है।मूल्य प्रकार के लिए डिफ़ॉल्ट कन्स्ट्रक्टर क्यों नहीं दिखता है?

static void ReflectOnType(Type type) 
{ 
    Console.WriteLine(type.FullName); 
    Console.WriteLine("------------"); 
    List<ConstructorInfo> constructors = 
      type.GetConstructors(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.Default).ToList(); 

    List<MethodInfo> methods = type.GetMethods().ToList(); 

    Type baseType = type.BaseType; 

    while (baseType != null) 
    { 
      constructors.AddRange(baseType.GetConstructors(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | 
           BindingFlags.Instance | BindingFlags.Default)); 
      methods.AddRange(baseType.GetMethods()); 
      baseType = baseType.BaseType; 
    } 

    Console.WriteLine("Reflection on {0} type", type.Name); 

    for (int i = 0; i < constructors.Count; i++) 
    { 
     Console.Write("Constructor: {0}.{1}", constructors[i].DeclaringType.Name, constructors[i].Name); 
     Console.Write("("); 
     ParameterInfo[] parameterInfos = constructors[i].GetParameters(); 
     if (parameterInfos.Length > 0) 
     { 
      for (int j = 0; j < parameterInfos.Length; j++) 
      { 
       if (j > 0) 
       { 
        Console.Write(", "); 
       } 
       Console.Write("{0} {1}", parameterInfos[j].ParameterType, parameterInfos[j].Name); 
      } 
     } 
     Console.Write(")"); 

     if (constructors[i].IsSpecialName) 
     { 
      Console.Write(" has 'SpecialName' attribute"); 
     } 
     Console.WriteLine(); 
    } 
    Console.WriteLine(); 

    for (int i = 0; i < methods.Count; i++) 
    { 
     Console.Write("Method: {0}.{1}", methods[i].DeclaringType.Name, methods[i].Name); 
     // Determine whether or not each field is a special name. 
     if (methods[i].IsSpecialName) 
     { 
      Console.Write(" has 'SpecialName' attribute"); 
     } 
     Console.WriteLine(); 
    } 
} 

लेकिन जब मैं इस विधि के लिए 'int' प्रकार पास करता हूं, तो मुझे आउटपुट में अंतर्निहित कन्स्ट्रक्टर क्यों नहीं दिखाई देता? या, मैं डिफॉल्ट कन्स्ट्रक्टर को सूचीबद्ध करने के लिए उपर्युक्त कोड को कैसे संशोधित करूं (यदि मुझे मेरे कोड में कुछ याद आ रहा है)।

+2

दिलचस्प पढ़ा जा सकता है: http://msmvps.com/blogs/jon_skeet/archive/2008/12/10/value-types- और-पैरामीटर रहित-constructors.aspx –

उत्तर

9

सी # (और अधिकांश सीएलआई भाषाओं) में - एक संरचना पर पैरामीटर रहित कन्स्ट्रक्टर निर्दिष्ट करना प्रतिबंधित है, और इस तरह, सी # (और अधिकांश अन्य .NET भाषाओं) में बनाई गई संरचना में पैरामीटर रहित कन्स्ट्रक्टर भी परिभाषित नहीं होगा आईएल। सीएलआर हमेशा निर्धारित नियमों का उपयोग करके मूल्य प्रकारों को प्रारंभ करता है (मूल रूप से, शून्य समकक्षों के साथ सभी मानों को भरना), और सी # एकमात्र विकल्प के रूप में लागू करता है।

डिफ़ॉल्ट के बाद से, पैरामीटर रहित कन्स्ट्रक्टर सी # जेनरेटेड स्ट्रक्चर में मौजूद नहीं है, यह प्रतिबिंब का उपयोग करते समय प्रदर्शित नहीं होता है।

+0

रीड, आपके पास कोई एमएसडीएन है दस्तावेज़ीकरण या इसके बारे में एक लेख तो मैं और जान सकता हूं? – Arun

+0

@ अरुण: http://msdn.microsoft.com/en-us/library/aa288208(VS.71).aspx "स्ट्रक्चर में स्पष्ट पैरामीटर रहित कन्स्ट्रक्टर नहीं हो सकते हैं। स्ट्रक्चर सदस्यों को स्वचालित रूप से उनके डिफ़ॉल्ट मानों में प्रारंभ किया जाता है।" –

+0

@ अरुण: वर्तमान - http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx - "प्रत्येक मान प्रकार में एक निहित डिफ़ॉल्ट कन्स्ट्रक्टर होता है जो उस प्रकार के डिफ़ॉल्ट मान को प्रारंभ करता है।" –

1

यह सी # और सीएलआई विनिर्देशों के बीच एक अंतर है। सी # का कहना है कि सभी मूल्य-प्रकारों में एक (गैर-अतिरंजित) डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर होता है, लेकिन यह सीएलआई के मामले में नहीं है।

कई मामलों में, रन-टाइम डिफ़ॉल्ट कन्स्ट्रक्टर चलाएगा, भले ही यह मौजूद हो (यह उचित है क्योंकि सीआईएल को लक्षित करने वाली अधिकांश भाषाओं में से कोई आपको लिखने नहीं देता है); शून्य के साथ संरचना भरने के बाद कुछ भी नहीं कर रहा है। यहां जॉन स्कीट द्वारा interesting article है कि एक संरचना में एक पैरामीटर रहित कन्स्ट्रक्टर हैकिंग के साथ प्रयोग - यह कभी-कभी चलता है, और कभी-कभी संदर्भ के आधार पर नहीं चलता है।

किसी भी मामले में, प्रतिबिंब एपीआई आपको उस प्रकार का पैरामीटर रहित कन्स्ट्रक्टर नहीं दिखाता है क्योंकि ऐसा कोई नहीं है।

1

आप किसी भी निर्माता चाहते हैं तो आप के साथ जाने के द्वारा

var consturctorList = type.GetContructors(); 

contructors की सूची प्राप्त कर सकते हैं अपने मूल्य नहीं स्पष्ट रूप से परिभाषित कंस्ट्रक्टर्स के साथ एक struct लिखते हैं, तो आप एक खाली सूची के ऊपर के बाद से अंतर्निहित निर्माता है मिल जाएगा उपलब्ध नहीं प्रतिबिंब में यह के साथ खिलवाड़ के लिए, आप अक्रमांकन विधि का उपयोग कर सकते हैं

FormatterServices.GetUninitializedObject(Type type) 
संबंधित मुद्दे

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