static
Newbies समझ के लिए कीवर्ड एक छोटे से कठिन हो सकता है। इसका प्राथमिक उद्देश्य वर्ग सदस्य की पहचान करना है क्योंकि वह कक्षा के किसी एक उदाहरण से संबंधित नहीं है, बल्कि केवल कक्षा के बजाय।
बहुत अधिक विस्तार में जाने के बिना, सी # (और जावा) वस्तु-उन्मुख आदर्श को सख्ती से लागू करता है कि सभी कोड और डेटा एक वस्तु से संबंधित होने चाहिए, और इसलिए यह गुंजाइश, दृश्यता और जीवनकाल में सीमित है। यह आमतौर पर सबसे अच्छा अभ्यास है जहाँ किसी वास्तविक दुनिया की चीज़ का प्रतिनिधित्व करने वाली वस्तु का मूल सिद्धांत लागू होता है। हालाँकि, यह हमेशा नहीं होता है; कभी-कभी आपको जिस चीज़ की आवश्यकता होती है वह एक फ़ंक्शन या वैरिएबल है जिसे आप कोड में कहीं से भी प्राप्त कर सकते हैं , इसके लिए आपको किसी ऑब्जेक्ट के संदर्भ में इसे पास करने की आवश्यकता नहीं है, और इस बात की गारंटी के साथ कि जिस डेटा को आप देख रहे हैं या बदल रहे हैं, वह वास्तव में हर कोई है और किसी वस्तु के एक अलग उदाहरण से संबंधित है, न कि उसके साथ काम कर रहा है।
इस तरह का व्यवहार "वैश्विक" फ़ंक्शन या चर के रूप में C और C ++ में उपलब्ध था, जो किसी ऑब्जेक्ट में एनकैप्सुलेटेड नहीं था। तो, एक समझौता के रूप में, C # और Java "स्टैटिक स्कोप" का समर्थन करता है, कोई अभिभावक वस्तु और सीमित-स्कोप उदाहरण सदस्यों के साथ सही मायने में वैश्विक कोड के बीच का आधा बिंदु।
किसी भी "कोड सदस्य" (फ़ंक्शन, प्रॉपर्टी, फील्ड) के रूप में घोषित static
कार्यक्रम के main()
कार्य की पहली पंक्ति के रूप में दायरे में आता है , और main()
फ़ंक्शन समाप्त होने तक इसे नहीं छोड़ता है । सादे अंग्रेजी में, एक स्थिर सदस्य मौजूद है और जब तक कार्यक्रम चल रहा है तब तक इसका उपयोग किया जा सकता है। इसके अलावा, स्थैतिक सदस्यों को स्वयं प्रकार के सदस्य के रूप में बुलाकर आमंत्रित किया जाता है, न कि उस प्रकार के किसी एक उदाहरण के सदस्य:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
यह स्थिर सदस्यों को किसी भी कोड को दिखाता है, जिसे इस प्रकार का ज्ञान होता है, चाहे वे इसके किसी एक उदाहरण के बारे में जानते हों या नहीं।
आपके प्रश्न का उत्तर देने के लिए, किसी चीज़ को स्थैतिक के रूप में चिह्नित करने का प्राथमिक लाभ यह है कि यह जहाँ कहीं भी स्वयं ज्ञात है, वहां दिखाई देता है, भले ही उपभोग कोड में कोई वस्तु हो या नहीं। एक मामूली प्रदर्शन लाभ भी है; क्योंकि विधि स्थिर दायरे में है, यह केवल अन्य स्थिर सदस्यों (एक ही वर्ग या अन्य) तक पहुंच सकती है, और जो कुछ भी एक पैरामीटर के रूप में पारित किया जाता है। इसलिए, रनटाइम को किसी ऑब्जेक्ट के वर्तमान उदाहरण के लिए किसी भी संदर्भ को हल करने की आवश्यकता नहीं है, क्योंकि यह संदर्भ-विशिष्ट राज्य की जानकारी प्रदान करने के लिए आमतौर पर एक इंस्टेंस विधि के लिए होगा।
संपूर्ण कक्षाओं को स्थैतिक भी चिह्नित किया जा सकता है; ऐसा करने से, आप संकलक को बताते हैं कि कक्षा की घोषणा में केवल स्थैतिक सदस्य शामिल होंगे, और इस तरह इसे तत्काल नहीं किया जा सकता है। यह सुनिश्चित करने का एक आसान तरीका है कि एक, और केवल एक, स्मृति में किसी वस्तु की प्रतिलिपि; कक्षा और उसमें सब कुछ स्थिर करें। हालांकि, यह बहुत दुर्लभ है कि यह इस तरह की जरूरत का सबसे अच्छा समाधान है। ऐसी स्थिति में जहां डेटा के सेट की एक प्रतिलिपि की आवश्यकता होती है, "सिंगलटन" को आमतौर पर इसके बजाय वकालत की जाती है; यह एक गैर-स्थिर वर्ग है, जो स्वयं के एकल उदाहरण तक पहुँच प्रदान करने के लिए एक स्थिर अभिगमकर्ता और एक गैर-सार्वजनिक निर्माणकर्ता का उपयोग करता है। सैद्धांतिक रूप से, एक सिंगलटन पूरी तरह से स्थिर वर्ग के समान लाभ प्रदान करता है, लेकिन उदाहरण-आधारित, ऑब्जेक्ट-ओरिएंटेड तरीके से क्लास का उपयोग करने की अतिरिक्त क्षमता के साथ।