2010-06-09 12 views
5

मैंने इस तरह के कोड को काम पर देखा:एक निर्माता पर एक स्थिर संशोधक का मतलब क्या है?

class FooPlugin : IPlugin // IPlugin is a Microsoft CRM component, it has something special about it's execution 
{ 
    static FooPlugin() 
    { 
    SomeObject.StaticFunction(); // The guy who wrote it said it's meaningful to this question but he can't remember why. 
    } 
} 

कोई विचार किसी कन्स्ट्रक्टर पर स्थिर संशोधक का मतलब है और इस मामले में इसकी आवश्यकता क्यों है?

+1

असल में, सभी संशोधक एक स्थिर निर्माता पर अस्वीकृत हैं, इसलिए यह केवल स्थिर FooPlugin() होगा। इसके अलावा यह स्वचालित रूप से लागू किया जाता है, और मांग पर इसे निष्पादित करने का कोई तरीका नहीं है। – SWeko

+0

@SWeko: मेरा बुरा तुम सही हो, मैं भूल गया कि वास्तव में क्या था। –

उत्तर

6

यह कक्षा का स्थैतिक प्रारंभिक है।

जब आप किसी विधि, फ़ील्ड, संपत्ति या कक्षा के किसी और चीज का उपयोग करते हैं तो इसे कॉल किया जाएगा। दूसरे शब्दों में, इसे पहली बार कक्षा का उपयोग करने के लिए कहा जाएगा।

static constructors on MSDN

देखें आप यहां स्थिर सामान को प्रारंभ कर सकते हैं।

अपने उदाहरण में यह है कि SomeObject.StaticFunction() एक बार फोन करने के लिए इससे पहले कि लोग FooPlugin का उपयोग करेगा, शायद इसलिए यह FooPlugin उपयोग करने से पहले प्रारंभ हो जाएगा चाहता था जो कोई भी लिखा है कि लगता है।

ध्यान दें कि जब आप इसका उपयोग करते हैं तो कुछ प्रदर्शन हिट होते हैं और दृश्य स्टूडियो (कोड विश्लेषण का उपयोग करके) आपको यह बता सकता है कि आप स्थैतिक फ़ील्ड इनलाइन को प्रारंभ करने से बेहतर हैं।

CA1810: Initialize reference type static fields inline on MSDN

+0

फिर, इसका क्या अर्थ है? मैं अभी तक सी # नहीं जानता। सी ++ में आप ऐसा कुछ नहीं कर सकते हैं। –

+0

सही उत्तर, लेकिन मैं उस घोषणा में 'सार्वजनिक' द्वारा थोड़ा परेशान हूं। जब मैंने गलती से एक स्थिर कन्स्ट्रक्टर पर एक्सेस संशोधक निर्दिष्ट किया तो मुझे हमेशा संकलन-समय त्रुटि मिली। क्या यह सी # 4.0 में बदल गया? –

+2

@the_drow: अपने सिर से सी ++ प्राप्त करें, आपका जीवन तुरंत बेहतर हो जाएगा। स्टेटिक कन्स्ट्रक्टर एक विधि है जिसे बिल्कुल एक बार कहा जाता है, पहली बार जब आप कक्षा का उपयोग करने का प्रयास करते हैं। यहां अस्पष्ट क्या है? –

3

देखें यह वस्तु के लिए स्थिर निर्माता परिभाषित करता है।

एक स्थिर निर्माता लिए किया जाता है किसी भी स्थिर डेटा को प्रारंभ, या के लिए एक विशेष कार्रवाई की जरूरत है कि एक बार केवल प्रदर्शन किया प्रदर्शन करते हैं। इसे पहले उदाहरण से पहले कहा जाता है या किसी स्थिर सदस्यों का संदर्भ दिया जाता है।

और पढ़ें MSDN - Static Constructors (C#)

+0

डुह लेकिन इसका क्या अर्थ है? –

+1

@the_drow - दुह। लिंक यही है। लेकिन मैंने एमएसडीएन से प्रासंगिक उद्धरण पोस्ट किया। –

0

पर एक static निर्माता वर्ग चौड़ा प्रारंभ करने में प्रयोग किया जाता है (अर्थात static) के सदस्यों, के रूप में उदाहरण के सदस्यों का विरोध किया।

3

मैं यह नहीं कह सकते क्यों यह अपने विशेष मामले में आवश्यक है, लेकिन एक स्थिर निर्माता के लिए प्रेरणा आम तौर पर इन में से एक है:

  1. वर्ग के सभी उदाहरणों एक का एक ही उदाहरण के लिए पहुंच की आवश्यकता है वस्तु, या
  2. कुछ बाहरी वस्तु के प्रारंभ वर्ग के सभी उदाहरणों के लिए एक शर्त है (अपने उदाहरण में मामला की तरह लगता है) या
  3. कुछ डेटा संरचना के प्रारंभ या सेवा लेता है बार-बार ऐसा करने के लिए बहुत ज्यादा समय लगता है (एक चर पहले मामले के आयन)।
+0

# 2 है। अब मैं समझ गया। वह कार्य ओआरएम के भीतर कुछ शुरू करता है। –

+1

यदि आप सी ++ पृष्ठभूमि से आते हैं, तो सी ++ के बराबर समझाया गया है: http://stackoverflow.com/questions/1197106/static-constructors-in-c-need-to-initialize-private-static-objects – JasonTrue

0

बस ऊपर जवाब में जोड़ने के लिए, स्थिर निर्माता (या जावा के मामले में स्थिर ब्लॉक) केवल एक बार जब वर्ग पहला है स्मृति में लोड निष्पादित हो। उद्देश्य स्थिर क्षेत्रों को प्रारंभ करना है, जो अन्यथा डेटा प्रकार के संबंधित डिफ़ॉल्ट मान को मानेंगे।कभी-कभी मैं ऑब्जेक्ट मॉडल बनाने के लिए स्थिर रचनाकारों का उपयोग करता हूं जिसे मैं एप्लिकेशन के पूरे जीवनकाल में उपयोग करना चाहता हूं।

1

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

class NeedsStaticConstructor 
{ 

    private static Size s_size = new Size(100, 100); // can be done inline 
    private static StringFormat s_format;   // more complex initialization needs code 

    static NeedsStaticConstructor() 
    { 
     s_stateTextFormat = new StringFormat(StringFormatFlags.NoWrap); 
     s_stateTextFormat.Alignment = StringAlignment.Near; 
     s_stateTextFormat.LineAlignment = StringAlignment.Far; 
    } 
} 
संबंधित मुद्दे