भाग्य की इच्छा से, हाल के वर्षों में मुझे एक और बहुत ही आकर्षक शौक मिला है - सीखने के लिए। मैं ऐसे लोगों को सिखा रहा हूं जो C # प्रोग्रामर बनना चाहते हैं। लोग अलग-अलग आते हैं: तकनीकी, मानवता, अपनी मर्जी से कोई, संगठनों से भेजा गया कोई। विभिन्न स्तरों के बावजूद, मुझे उन्हें प्रशिक्षित करने की आवश्यकता है। इसलिए, मैं अपनी शिक्षण सामग्री को लगातार अपडेट और बेहतर बनाने की कोशिश करता हूं। इस संबंध में, मैं इस निष्कर्ष पर पहुंचा था: "लेकिन सामग्री को पाठ रूप में खींचना बुरा नहीं होगा ताकि उनका उपयोग करना सुविधाजनक हो।" कटौती के तहत, मैंने हाल ही में जारी किए गए व्याख्यानों में से एक उदाहरण के रूप में रखा।
सामान्य अवधारणा
सबसे पहले, आपको समझना चाहिए कि स्थिर क्या है। C # में एक स्थिर कीवर्ड है, जिसे इस पर लागू किया जा सकता है:
- खेतों
- गुण
- तरीकों
- ऑपरेटरों के लिए
- घटनाओं
- डिजाइनर को
- कक्षाएं
static class OneHuman { public static string Name { get; set; } public static int Age { get; set; } public static string GetInformation() { return string.Format("{0} is {1} years old", Name, Age); } }
स्टेटिक का तात्पर्य है कि आपको किसी क्लास को तत्काल करने की आवश्यकता नहीं है वर्ग के सभी उपरोक्त घटक इसके नाम को इंगित करके सुलभ हैं।
class Program { static void Main(string[] args) { OneHuman.Name = "Onizuka"; OneHuman.Age = 22; Console.WriteLine(OneHuman.GetInformation()); } }
यह ध्यान दिया जाना चाहिए कि पूरे वर्ग को स्थिर बनाने के लिए आवश्यक नहीं है। कभी-कभी अपने व्यक्तिगत सदस्यों के लिए स्टैटिक्स लागू करना पर्याप्त होता है।
class Box { public static string DefaultContext { get; set; } public string Context { get; set; } }
यदि पूरा वर्ग स्थिर है:
- आप नए कीवर्ड का उपयोग करके किसी क्लास को इंस्टेंट नहीं कर सकते।
- इसे एक ही वर्ग के गैर-स्थैतिक सदस्यों का उपयोग करने की अनुमति नहीं है।
- यह वंशानुक्रम का समर्थन नहीं करता है।
- अधिभार विधियों में असमर्थ।
यदि क्लास स्थिर नहीं है, लेकिन इसमें स्टैटिक विधियाँ शामिल हैं, तो इन विधियों पर निम्न प्रतिबंध लागू होते हैं:
- यह स्थिर से एक ही वर्ग के गैर-स्थैतिक सदस्यों का उपयोग करने की अनुमति नहीं है। बेशक, कोई भी आपको एक स्थिर विधि में एक वर्ग उदाहरण बनाने से परेशान नहीं करता है।
- स्थिर सदस्यों के लिए विरासत और बहुरूपता का समर्थन नहीं किया जाता है।
अधिक जानकारी
ऊपर, हमने ऐसे निर्माण को स्थैतिक निर्माता के रूप में नहीं माना। मेरी राय में, बल्कि दिलचस्प सवालों में से एक, कक्षाओं के स्थिर निर्माणकर्ता कॉल कब होता है?
class Box { static Box() { Console.WriteLine("static ctor was called"); } public Box() { Console.WriteLine("default ctor was calleds"); } public static string Data { get { return "You are trying to get data"; } } public const int Foo = 7; }
मुझे लगता है कि आपने पहले ही देखा था कि स्थैतिक निर्माता के लिए एक्सेस स्पेसियर का उपयोग नहीं किया गया है। सब कुछ बहुत स्पष्ट है, आप स्टैटिक्स के निर्माण को नियंत्रित नहीं करते हैं। यदि आप नीचे दिए गए कोड को निष्पादित करने का प्रयास करते हैं, तो आप निम्न कथन को सत्यापित कर सकते हैं: क्लास के किसी भी सदस्य को एक्सेस करने से पहले स्टेटिक कंस्ट्रक्टर को बुलाया जाता है।
class Program { static void Main(string[] args) { var data = Box.Data; var box = new Box(); } }
आप बॉक्स क्लास तक पहुँचने वाली किसी भी लाइन के बारे में टिप्पणी करके चारों ओर खेल सकते हैं। अब कोड को थोड़ा बदलते हैं और हमारे कथन को ट्वीक करते हैं
class Program { static void Main(string[] args) { var data = Box.Foo; } }
इस स्थिति में, स्थिर निर्माता के लिए कॉल नहीं होती है। अतः:
स्थैतिक निर्माणकर्ता को स्थिरांक के अपवाद के साथ वर्ग के किसी भी सदस्य तक पहुंचने से पहले कहा जाता है । मैंने जानबूझकर इस परिभाषा में शब्द वर्ग का उपयोग किया है। संरचनाओं के साथ बहुत सारे "चुटकुले" हैं। आपको इस बात की जानकारी होनी चाहिए कि C # में आप डिफॉल्ट कंस्ट्रक्टर को ओवरराइड नहीं कर सकते हैं, लेकिन आप बिना पैरामीटर के स्टैटिक कंस्ट्रक्टर को परिभाषित कर सकते हैं। हालांकि, इसे हमेशा नहीं कहा जाएगा, उदाहरण के लिए, यह नहीं कहा जाएगा, उदाहरण के लिए, आप संरचनाओं की एक सरणी बनाने की कोशिश करते हैं।
स्टैटिक्स का उपयोग करने के बारे में सामान्य विचार
स्थैतिक वर्गों का उपयोग करने के लिए और जब ऐसा नहीं करने के लिए अपेक्षाकृत कई राय हैं। अपने अनुभव के आधार पर, मैं ध्यान देता हूं कि स्थिर वर्ग नौसिखिए डेवलपर्स का पसंदीदा हथियार है। इस्तेमाल किया और भूल गया - एक अच्छी अवधारणा।

स्टैटिक्स की प्रयोज्यता के बारे में पेचीदगियों को समझने के लिए, आपको OOP की अवधारणाओं पर वापस लौटना चाहिए। कल्पना करें कि आपके पास एक साइकिल है, लेकिन आपके पड़ोसी और पड़ोसी के पड़ोसी के पास एक साइकिल है, आदि। इस मामले में, स्टैटिक्स अस्वीकार्य है। क्योंकि साइकिल विभिन्न रंगों, भारों की हो सकती हैं, पहियों की एक अलग संख्या होती है। मेरा मतलब है, एक ही प्रजाति के विभिन्न उदाहरण। स्टेटिक्स कुछ वैश्विक ऑब्जेक्ट्स / क्रियाओं के लिए लागू होता है, जब क्लास के इंस्टेंस बनाने का अर्थ निहित नहीं होता है (अक्सर कुछ उपयोगिता विधियों के लिए: कंसोल के लिए आउटपुट कंसोल है ।riteLine (), Array.Sort सरणी को सॉर्ट करना)। अक्सर कक्षाएं स्थिर और गैर-स्थिर कार्यक्षमता प्रदान कर सकती हैं। जब संदेह हो, तो रुकें और सोचें कि क्या आपको "इस" की एक प्रति की आवश्यकता है। यदि आप वास्तव में वर्ग के उदाहरणों के निर्माण को नियंत्रित करना चाहते हैं, या यहां तक कि केवल एक ही है, तो इन उद्देश्यों के लिए
सिंगलटन पैटर्न महान है। OOP के ढांचे के भीतर, स्टेटिक्स में कई नुकसान हैं। वह इतनी बुरी क्यों है?
बहुरूपता
जैसा कि ऊपर उल्लेख किया गया है, स्थिर वर्ग विरासत का समर्थन नहीं करते हैं, अर्थात्। आप इंटरफ़ेस या किसी अन्य वर्ग से विरासत में नहीं मिल सकते हैं और इस प्रकार कार्यक्षमता बढ़ा सकते हैं।
परीक्षण
स्टैटिक्स का उपयोग करते समय, परीक्षण काफी कठिन होता है। आप इंटरफेस के आधार पर कोड को जल्दी से बदल नहीं सकते। यदि आपको बदलने की आवश्यकता है, तो गंभीरता से, कोड के महत्वपूर्ण टुकड़ों को फिर से लिखना।
एकमात्र जिम्मेदारी
स्टैटिक विधियों का उपयोग अक्सर व्यावसायिक उद्देश्यों के लिए किया जाता है, चाहे वह एरर लॉग के लिए आउटपुट हो या किसी ऐरे को छांटने में। इसलिए, कभी-कभी सभी स्थिर कार्यक्षमता को एक वर्ग में रटने की इच्छा होती है, इसे मेगा यूटिल्स कहते हैं। यह ऐसा करने के लायक नहीं है, छोटी कक्षाओं का एक पूरा समूह बनाने के लिए बेहतर है, प्रत्येक गतिविधि के अपने क्षेत्र के लिए जिम्मेदार है।