C # में "स्थिर विधि" क्या है?


177

स्थैतिक कीवर्ड को किसी विधि से जोड़ने पर इसका क्या अर्थ है?

public static void doSomething(){
   //Well, do something!
}

क्या आप staticकक्षा में कीवर्ड जोड़ सकते हैं ? तब इसका क्या मतलब होगा?


9
आप केवल क्लास_name.static_method_name () द्वारा उस वर्ग का उदाहरण बनाए बिना स्टैटिक विधि का उपयोग कर सकते हैं;
जावेद अकरम

प्रोग्रामिंग स्तर पर, हमें यह महसूस होता है कि हम किसी कक्षा / प्रकार का उदाहरण बनाए बिना एक स्थिर विधि को कॉल करने में सक्षम हैं। आंतरिक रूप से ऐसा नहीं है। CLR आंतरिक रूप से एक विशेष उदाहरण का प्रबंधन करता है जिसे कॉल को स्थिर विधियों में प्रबंधित करने के लिए टाइप इंस्टेंस कहा जाता है । कृपया इसका उत्तर देखें । यह बहुत पेचीदा है।
RBT

जवाबों:


313

एक staticफ़ंक्शन, एक नियमित ( उदाहरण के विपरीत) ) फ़ंक्शन के , वर्ग की एक आवृत्ति से जुड़ा नहीं है।

एक staticवर्ग एक ऐसा वर्ग है जिसमें केवल शामिल हो सकता हैstatic सदस्य , और इसलिए उसे तत्काल नहीं किया जा सकता है।

उदाहरण के लिए:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

कॉल करने के लिए InstanceMethod, आपको कक्षा का एक उदाहरण चाहिए:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
तो यह एक उदाहरण विधि के बजाय एक वर्ग विधि की तरह है?
मोशे

4
@ मोशे: बिल्कुल। एक स्थिर विधि के साथ, आपको विधि को कॉल करने के लिए कक्षा के उदाहरण की आवश्यकता नहीं है, बस कक्षा।
बाइनरी वॉरियर

3
लेकिन क्या वास्तव में किसी प्रकार की तकनीकी सीमा है जो एक उदाहरण पर एक स्थिर विधि को कॉल करने से रोकती है? यदि संकलक इसे अनुमति देगा, तो इसके सुलभ होने का क्या खतरा है?
kroonwijk

2
@ क्रून: इसका कोई मतलब नहीं होगा। उदाहरण के तरीके वास्तव में एक उदाहरण को पहले छिपे हुए पैरामीटर के रूप में लेते हैं। स्थैतिक तरीके नहीं हैं। मेरी ब्लॉग पोस्ट देखें: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

जहाँ "StaticMethod" क्लास विधि है और "InstanceMethod" क्लास SomeClass की एक इंस्टेंस विधि है
उस्मान यूनास

26

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
"एक स्ट्रिंग पर परिवर्तन करना" का उपयोग करना एक बुरा उदाहरण है - तार अपरिवर्तनीय हैं और इसे बदला नहीं जा सकता है। लेकिन, अन्यथा, स्पष्टीकरण समझ में आता है (स्ट्रिंग के लिए एक गैर-अपरिवर्तनीय वर्ग का प्रतिस्थापन)
फ्लाईडॉग 57

13

एक स्थिर विधि, फ़ील्ड, प्रॉपर्टी या ईवेंट किसी वर्ग पर तब भी कॉल करने योग्य है, जब क्लास का कोई उदाहरण नहीं बनाया गया हो। यदि कक्षा के किसी भी उदाहरण को बनाया जाता है, तो उनका उपयोग स्थैतिक सदस्य तक पहुंचने के लिए नहीं किया जा सकता है। स्थिर क्षेत्रों और घटनाओं की केवल एक प्रति मौजूद है, और स्थैतिक विधियाँ और गुण केवल स्थैतिक क्षेत्रों और स्थैतिक घटनाओं तक पहुँच सकते हैं। स्टेटिक सदस्यों को अक्सर डेटा या गणना का प्रतिनिधित्व करने के लिए उपयोग किया जाता है जो ऑब्जेक्ट स्टेट की प्रतिक्रिया में नहीं बदलते हैं; उदाहरण के लिए, एक गणित पुस्तकालय में साइन और कोसाइन की गणना के लिए स्थिर तरीके हो सकते हैं। स्टैटिक क्लास के सदस्यों को स्टैटिक कीवर्ड का उपयोग मेम्बे के रिटर्न प्रकार से पहले घोषित किया जाता है


5

स्टेटिक फंक्शन का मतलब है कि यह क्लास से जुड़ा हुआ है (क्लास का एक विशेष उदाहरण नहीं बल्कि खुद क्लास) और यह तब भी लागू किया जा सकता है, जब कोई क्लास इंस्टेंसेस मौजूद न हो।

स्टेटिक क्लास का मतलब है कि वर्ग में केवल स्थिर सदस्य होते हैं।


5

शीघ्र ही आप स्थैतिक वर्ग को तत्काल नहीं कर सकते हैं: Ex:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

आप इस तरह नहीं बना सकते हैं:

myStaticClass msc = new myStaticClass();  // it will cause an error

आप केवल बना सकते हैं:

myStaticClass.someFunction();

0

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


-1

स्थैतिक चर वर्ग के ऑब्जेक्ट के साथ लिंक नहीं करता है। इसे classname के इस्तेमाल से एक्सेस किया जा सकता है। कक्षा के सभी ऑब्जेक्ट स्थिर चर साझा करेंगे।

फ़ंक्शन को स्थिर बनाते हुए, यह उस फ़ाइल के भीतर उस फ़ंक्शन की पहुंच को प्रतिबंधित करेगा।


-1

स्टैटिक कीवर्ड का कोर जो आपके पास इस (मेथड / वैरिएबल / क्लास) रैम पर केवल एक ही कॉपी होगा जो सभी कॉलिंग के लिए साझा किया गया है


-8

स्थिर कीवर्ड, जब किसी वर्ग पर लागू होता है, तो संकलक को उस वर्ग का एक भी उदाहरण बनाने के लिए कहता है। तब कक्षा का एक या अधिक उदाहरण 'नया' करना संभव नहीं है। एक स्थिर वर्ग में सभी विधियों को स्वयं को स्थिर घोषित किया जाना चाहिए।

यह संभव है, और अक्सर वांछनीय है, एक गैर-स्थिर वर्ग के स्थिर तरीके हैं। उदाहरण के लिए, किसी अन्य वर्ग का उदाहरण बनाते समय फ़ैक्टरी विधि को अक्सर स्थिर घोषित किया जाता है क्योंकि इसका अर्थ है कि फ़ैक्टर विधि वाले वर्ग के किसी विशेष उदाहरण की आवश्यकता नहीं है।

कैसे, कब और कहाँ MSDN देखें की एक अच्छी व्याख्या के लिए


8
नहीं, एक स्थिर वर्ग कभी त्वरित नहीं होता है। कि सब कुछ में यह स्थिर है, तुम क्यों हैं यह देखते हुए चाहते हैं यह दृष्टांत के लिए?
जॉन स्कीट

1
एक staticवर्ग के पास कोई उदाहरण नहीं है।
एसएल

4
क्षमा करें दोस्तों, मुझे समझ नहीं आ रहा है ... मैंने कहा कि एक एकल उदाहरण बनाया गया है और आप नया नहीं बना सकते। निश्चित रूप से एक एकल, स्थिर, उदाहरण बनाया गया है अन्यथा कोड कॉल करने योग्य नहीं होगा?
डेव अर्कले

2
एक स्थिर वर्ग के पास एक उदाहरण होता है, वास्तव में दो, वे सिर्फ theType के उदाहरण नहीं हैं। एक स्थिर वर्ग ढेर पर मौजूद होगा [Foo] टाइप ऑब्जेक्ट (JIT के लिए विधि लुकअप टेबल), और इनिशियलाइज़ेशन के लिए प्रयुक्त एक विशेष System.Type ऑब्जेक्ट।
mccainz

एक वर्ग को स्थिर घोषित किया जा सकता है, यह दर्शाता है कि इसमें केवल स्थिर सदस्य हैं। नए कीवर्ड का उपयोग करके स्थिर वर्ग के उदाहरण बनाना संभव नहीं है। जब प्रोग्राम या नेमस्पेस क्लास लोड किया जाता है, तो स्थैतिक कक्षाएं .NET फ्रेमवर्क सामान्य भाषा रनटाइम (CLR) द्वारा स्वचालित रूप से लोड की जाती हैं।
सतीश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.