2010-05-29 14 views
41

एक सामान्य वर्ग पर एक स्थिर निर्माता हर प्रकार आप इस जैसे सामान्य पैरामीटर में पारित के लिए चलाया जाएगा:सी # जेनेरिक स्टेटिक निर्माता

class SomeGenericClass<T> 
{ 
     static List<T> _someList; 
     static SomeGenericClass() 
     { 
      _someList = new List<T>(); 
     } 
} 

इस दृष्टिकोण का उपयोग करने के लिए किसी भी ड्रा पीठ कर रहे हैं?

उत्तर

52

हां, स्थैतिक कन्स्ट्रक्टर को प्रत्येक बंद वर्ग प्रकार (टाइप प्रकार पैरामीटर निर्दिष्ट करते समय बनाए गए प्रकार) के लिए एक बार बुलाया जाएगा। C# 3 specification, §10.12 स्टेटिक कन्स्ट्रक्टर देखें।

एक बंद वर्ग प्रकार के लिए स्थिर कन्स्ट्रक्टर किसी दिए गए एप्लिकेशन डोमेन में सबसे अधिक बार निष्पादित करता है।

और यह भी:

क्योंकि स्थिर निर्माता ठीक एक बार प्रत्येक निर्माण बंद के लिए वर्ग प्रकार क्रियान्वित किया जाता है, यह प्रकार पैरामीटर है कि कम से जाँच नहीं की जा सकती है, पर चलाने के समय के चेक को लागू करने के लिए एक सुविधाजनक जगह है बाधाओं के माध्यम से संकलन समय (§10.1.5)। उदाहरण के लिए, निम्न प्रकार लागू करने के लिए उस प्रकार तर्क एक enum है एक स्थिर निर्माता का उपयोग करता है:

class Gen<T> where T: struct 
{ 
    static Gen() { 
     if (!typeof(T).IsEnum) { 
      throw new ArgumentException("T must be an enum"); 
     } 
    } 
} 

यह भी पढ़ने के लिए §4.4.2 ओपन प्रासंगिक है और प्रकार के बंद कर दिया:

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

प्रत्येक बंद निर्मित प्रकार का स्थिर चर का अपना सेट होता है, जिसे किसी अन्य बंद निर्मित प्रकारों के साथ साझा नहीं किया जाता है।

इस कार्यक्रम कि आप अपने आप चला सकते हैं यह दर्शाता है कि स्थिर निर्माता तीन बार ही नहीं, एक बार कहा जाता है:

public class Program 
{ 
    class SomeGenericClass<T> 
    { 
     static SomeGenericClass() 
     { 
      Console.WriteLine(typeof(T)); 
     } 
    } 

    class Baz { } 

    static void Main(string[] args) 
    { 
     SomeGenericClass<int> foo = new SomeGenericClass<int>(); 
     SomeGenericClass<string> bar = new SomeGenericClass<string>(); 
     SomeGenericClass<Baz> baz = new SomeGenericClass<Baz>(); 
    } 
} 

आउटपुट:

 
System.Int32 
System.String 
Program+Baz 
+0

यह एक स्थिर वर्ग कैसा है? –

+5

@ जौके वैन डेर मास, जिन्होंने एक स्थिर वर्ग के बारे में बात की थी? सवाल एक सामान्य वर्ग के स्थैतिक कन्स्ट्रक्टर के बारे में है, स्थिर वर्ग नहीं ... –

+0

यह न तो था, इसलिए यह अभी भी लागू होता है :) –

0

हां, सामान्य प्रकार के लिए स्थिर सदस्य और निर्माता सामान्य जेनेरिक पैरामीटर के लिए विशिष्ट हैं और प्रत्येक अलग-अलग प्रकार के लिए चलेंगे। कोई वास्तविक कमी नहीं है। एक सामान्य में एक गैर-जेनेरिक वर्ग को पुन: सक्रिय करते समय सावधान रहें।

0

हां, यह आपके द्वारा आपूर्ति की जाने वाली हर प्रकार के लिए चलाएगा क्योंकि प्रत्येक अलग-अलग आपूर्ति प्रकार के लिए आपको अलग-अलग प्रकार मिलते हैं।

2

यह काम करेंगे, लेकिन एक नया आपके द्वारा उपयोग किए जाने वाले प्रत्येक प्रकार के लिए 'इंस्टेंस' बनाया जाएगा।

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