C # में स्थिर चर का उपयोग क्या है? इसका उपयोग कब करें? मैं विधि के अंदर स्थैतिक चर की घोषणा क्यों नहीं कर सकता?


106

मैंने C # में स्थिर चर के बारे में खोज की है, लेकिन मुझे अभी भी नहीं मिल रहा है कि इसका उपयोग क्या है। इसके अलावा, अगर मैं विधि के अंदर चर को घोषित करने की कोशिश करता हूं तो यह मुझे ऐसा करने की अनुमति नहीं देगा। क्यों?

मैंने स्थैतिक चर के बारे में कुछ उदाहरण देखे हैं। मैंने देखा है कि चर का उपयोग करने के लिए हमें कक्षा का एक उदाहरण बनाने की आवश्यकता नहीं है, लेकिन यह समझने के लिए पर्याप्त नहीं है कि इसका उपयोग क्या है और इसका उपयोग कब करना है।

दूसरी बात

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();

        Console.WriteLine(book.myInt); // Shows error. Why does it show me error?
                                       // Can't I access the static variable 
                                       // by making the instance of a class?

        Console.ReadKey();
    }
}

4
क्या आपका मतलब "स्थिर क्षेत्र" हो सकता है?
डेनिस

जैसे हम कक्षा स्थैतिक int i = 5 में घोषणा करते हैं
कार्तिक पटेल

3
VB.NET स्थानीय स्थिर चर का समर्थन करता है। उन्हें वीबी के साथ संगत रहने के लिए इसे लागू करना पड़ा। यह उत्पन्न होने वाली कोड की मात्रा बहुत बड़ी है , स्थानीय स्टेटिक्स मुश्किल हैं क्योंकि वे थ्रेड-सुरक्षित नहीं हैं। फ़ील्ड्स थ्रेड-सुरक्षित नहीं हैं, लेकिन हर कोई उम्मीद करता है कि।
हंस पसेंट

यदि आपको
मनचाही

3
आप प्रकार (इस मामले में Book) उदाहरण के माध्यम से नहीं के माध्यम से स्थिर चर / विधियों का उपयोग कर सकते हैं book, इसलिए आसान समाधान है Book.myInt
जैदर

जवाबों:


171

एक staticचर वर्ग के सभी उदाहरणों के बीच इसका मूल्य साझा करता है।

इसे स्थिर घोषित किए बिना उदाहरण:

public class Variable
{
    public int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

स्पष्टीकरण: यदि आप उपर्युक्त उदाहरण को देखते हैं, तो मैं केवल intचर घोषित करता हूं । जब मैं इस कोड को चलाने के उत्पादन हो जाएगा 10और 10। यह आसान है।

अब यहाँ स्थैतिक चर को देखते हैं; मैं चर को a घोषित कर रहा हूं static

स्थिर चर के साथ उदाहरण:

public class Variable
{
    public static int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

अब जब मैं कोड ऊपर चलाने के लिए, उत्पादन किया जाएगा 10और 15। तो स्थिर चर मान उस वर्ग के सभी उदाहरणों के बीच साझा किया जाता है।


9
@Pranay: हाँ बेहतर है, लेकिन अगर आप मुझे उदाहरण दिखाते हैं कि मैं ऊपर दिखाता हूं कि यह मेरे लिए और दूसरों के लिए बेहतर है .... वैसे भी अच्छा प्रयास ....
कार्तिक पटेल

1
यह वर्ग के लिए स्थिर है, अर्थात इसका मूल्य वर्ग में इसके मूल्य के साथ वफादार रहता है ... इसके लिए प्रतीक्षा करें ... वर्ग
chwi

आप कहते हैं कि एक स्थिर चर वर्ग के सभी उदाहरणों के बीच साझा किया जाता है ... लेकिन अगर कोई उदाहरण नहीं हैं तो क्या होगा? क्या आप अभी भी एक चर सेट कर सकते हैं? क्या इसे स्थिर वर्ग में गतिशील डेटा संग्रहीत करने की अनुमति है?
कोकोडको

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

33

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


5
खैर, दस्तावेज़ीकरण में इसे "स्थिर संशोधक के साथ घोषित क्षेत्र" कहा जाता है जिसे स्थैतिक चर कहा जाता है। msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx लेकिन आप बाकी स्पष्टीकरण पर सही हैं।
तेमन शिपाही

19

स्थिर चर का उपयोग तब किया जाता है जब चर की केवल एक प्रति की आवश्यकता होती है। इसलिए यदि आप विधि के अंदर परिवर्तनशील घोषित करते हैं तो ऐसे चर का कोई उपयोग नहीं होता है जो केवल कार्य करने के लिए स्थानीय हो जाते हैं।

स्थिर का उदाहरण है

class myclass
{
    public static int a = 0;
}

वैरिएबल घोषित स्थिर आमतौर पर एक वर्ग के सभी उदाहरणों में साझा किए जाते हैं।

वैरिएबल घोषित स्थिर आमतौर पर एक वर्ग के सभी उदाहरणों में साझा किए जाते हैं। जब आप VariableTest वर्ग के कई उदाहरण बनाते हैं, तो यह चर उन सभी में साझा किया जाता है। इस प्रकार, किसी भी समय, स्थायी चर में निहित केवल एक स्ट्रिंग मान होगा।

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


क्या आप उदाहरण के साथ समझा सकते हैं?
कार्तिक पटेल

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

@ कार्तिक पटेल क्योंकि आपको स्थिर myInt तक पहुंचने के लिए वर्ग नाम का उपयोग करना होगा। यह ऐसा क्यों है, मुझे नहीं पता। लेकिन मैं कहूंगा कि यह बहुत स्पष्ट है क्योंकि आप कक्षा के एक स्थिर हिस्से तक पहुंचना चाहते हैं, यह स्थिर नहीं है यदि आपको इसे एक्सेस करने के लिए एक उदाहरण की आवश्यकता है।
dowhilefor

@ योंहाइलफ़ोर: लेकिन जैसा कि आपने ऊपर बताया है कि "वैरिएबल घोषित स्थिर आमतौर पर एक वर्ग के सभी उदाहरणों में साझा किए जाते हैं।" तो फिर इसका अर्थ क्या है?
कार्तिक पटेल

@ कार्तिक पटेल आप एक उदाहरण के साथ बाहर से चर का उपयोग नहीं कर सकते हैं, लेकिन आप हमेशा अपनी कक्षा के अंदर स्थिर चर का उपयोग कर सकते हैं और फिर इसे सभी उदाहरणों के साथ साझा किया जाता है। इसके अलावा यह मैं नहीं था जिसने यह जवाब दिया, मैं सिर्फ इस पर टिप्पणी कर रहा हूं।
dowhilefor

9

स्थिर चर के लिए कुछ "वास्तविक दुनिया" उदाहरण:

एक वर्ग का निर्माण करना जहाँ आप अपने आवेदन के लिए हार्डकोड मानों तक पहुँच सकते हैं। एक गणना के समान है, लेकिन डेटाटाइप पर अधिक लचीलेपन के साथ।

public static class Enemies
{
    public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}");
}

व्यापक रूप से ज्ञात सिंगलटन, यह कक्षा के ठीक एक उदाहरण को नियंत्रित करने की अनुमति देता है। यह बहुत उपयोगी है यदि आप इसे अपने पूरे एप्लिकेशन में एक्सेस करना चाहते हैं, लेकिन इसे हर वर्ग को पास नहीं करते हैं, तो केवल इस वर्ग को इसका उपयोग करने की अनुमति दें।

public sealed class TextureManager
    {
        private TextureManager() {}
        public string LoadTexture(string aPath);

        private static TextureManager sInstance = new TextureManager();

        public static TextureManager Instance
        {
            get { return sInstance; }
        }
    }

और यह है कि आप कैसे बनावट प्रबंधक को बुलाएंगे

TextureManager.Instance.LoadTexture("myImage.png");

आपके अंतिम प्रश्न के बारे में: आप संकलक त्रुटि CS0176 का उल्लेख कर रहे हैं । मैंने उस बारे में और अधिक जानकारी प्राप्त करने की कोशिश की, लेकिन केवल वही मिला, जिसके बारे में एमएसडीएन को कहना था:

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


5

स्टेटिक चर का उपयोग तब किया जाता है जब इसकी केवल एक प्रति की आवश्यकता होती है। इसे एक उदाहरण से समझाता हूं:

class circle
{
    public float _PI =3.14F;
    public int Radius;

    public funtionArea(int radius)
    {
        return this.radius * this._PI      
    }
}
class program
{
    public static void main()
    {
        Circle c1 = new Cirle();
        float area1 = c1.functionRaduis(5);
        Circle c2 = new Cirle();
        float area2 = c1.functionRaduis(6);
    }
}

अब यहाँ हमने अपने classवृत्त के लिए 2 उदाहरण बनाए हैं , अर्थात _PI अन्य चर के साथ प्रतियों के २ सेट बनाए गए हैं। यदि हम इस वर्ग के उदाहरणों के बहुत सारे हैं तो कहेंगे कि _PIमेमोरी पर कब्जे की कई प्रतियां बनाई जाएंगी। तो ऐसे मामलों में इस तरह के वैरिएबल बनाना बेहतर है_PI static और उन पर काम होता है।

class circle
{
    static float _PI =3.14F;
    public int Radius;

    public funtionArea(int radius)
    {
        return this.radius * Circle._PI      
    }
}
class program
{
    public static void main()
    {
        Circle c1 = new Cirle();
        float area1 = c1.functionRaduis(5);
        Circle c2 = new Cirle();
        float area2 = c1.functionRaduis(6);
    }
}

अब classसर्कल के लिए चाहे कितने भी उदाहरण हों , _PIहमारी मेमोरी को बचाने के लिए केवल एक प्रति ही मौजूद है ।


4

स्टैटिक क्लासेस के लिए आपको उस क्लास की एक ऑब्जेक्ट बनाने की आवश्यकता नहीं होती है / उन्हें इंस्टेंट करना होता है, आप सी # कीवर्ड को क्लास के नाम के सामने स्थिर कर सकते हैं, इसे स्टैटिक बना सकते हैं।

याद रखें: हम कंसोल क्लास, स्ट्रिंग क्लास, एरे क्लास को इंस्टेंटिमिट नहीं कर रहे हैं।

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();
       //Use the class name directly to call the property myInt, 
      //don't use the object to access the value of property myInt

        Console.WriteLine(Book.myInt);

        Console.ReadKey();

    }
}

बहुत अच्छा अवलोकन क्योंकि यदि आप myInt संपत्ति के मूल्य तक पहुंचने के लिए ऑब्जेक्ट का उपयोग करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी: स्थैतिक शून्य मुख्य () {पुस्तक पुस्तक = नई पुस्तक (); // यह आपको त्रुटि देता है: book.myInt = 5;
लियोनिडा

2

इस @ कार्तिक पटेल उदाहरण से शुरू करते हुए, मैं थोड़ा बदल गया हूं शायद अब स्थिर चर के बारे में अधिक स्पष्ट है

 public class Variable
    {
        public static string StaticName = "Sophia ";
        public string nonStName = "Jenna ";
        public void test()
        {
            StaticName = StaticName + " Lauren"; 
            Console.WriteLine("  static ={0}",StaticName);
            nonStName = nonStName + "Bean ";
            Console.WriteLine("  NeStatic neSt={0}", nonStName);

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Variable var = new Variable();
            var.test();
            Variable var1 = new Variable();
            var1.test();
            Variable var2 = new Variable();
            var2.test();
            Console.ReadKey();

        }
    }

Output 
  static =Sophia  Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren
  NeStatic neSt=Jenna Bean
  static =Sophia  Lauren Lauren Lauren
  NeStatic neSt=Jenna Bean
  1. C # में क्लास वेरिएबल वीएस इंस्टेंस वेरिएबल

    स्टेटिक क्लास के सदस्य C # या क्लास वेरिएबल

    class A
    {
        // Class variable or " static member variable"  are declared with 
        //the "static " keyword
    
        public static int i=20;
        public int j=10;         //Instance variable 
        public static string s1="static class variable"; //Class variable 
        public string s2="instance variable";        // instance variable 
    }
    class Program
    {
        static void Main(string[] args)
        {
            A obj1 = new A();
    
            // obj1 instance variables 
            Console.WriteLine("obj1 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj1.j);
            Console.WriteLine(obj1.s2);
            Console.WriteLine(A.s1);
    
            A obj2 = new A();
    
            // obj2 instance variables 
            Console.WriteLine("obj2 instance variables ");
            Console.WriteLine(A.i);
            Console.WriteLine(obj2.j);
            Console.WriteLine(obj2.s2);
            Console.WriteLine(A.s1);
    
            Console.ReadKey();
    
        }
    
    
    }

    }

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

https://en.wikipedia.org/wiki/Class_variable

https://en.wikipedia.org/wiki/Instance_variable

https://en.wikipedia.org/wiki/Static_variable

https://javaconceptoftheday.com/class-variables-and-instance-variables-in-java/?fbclid=IwAR1_dtpHzg3bC5WlGQGdgewaTvuOI6cwVeFUtTV8IZuGTj1qH5PmKGwX0yM

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members


1

प्रकार के उदाहरण पर काम करने वाले डेटा सदस्यों और फ़ंक्शन सदस्यों को उदाहरण सदस्य कहा जाता है। Int का ToString तरीका (उदाहरण के लिए) उदाहरण के सदस्यों का उदाहरण है। डिफ़ॉल्ट रूप से, सदस्य उदाहरण सदस्य होते हैं। डेटा सदस्य और फ़ंक्शन सदस्य जो टाइप के उदाहरण पर काम नहीं करते हैं, बल्कि टाइप पर ही स्थिर के रूप में चिह्नित होने चाहिए। Test.Main और Console.WriteLine विधियाँ स्टैटिक विधियाँ हैं। कंसोल वर्ग वास्तव में एक स्थिर वर्ग है, जिसका अर्थ है कि इसके सभी सदस्य स्थिर हैं। आप वास्तव में कभी कंसोल के उदाहरण नहीं बनाते हैं - पूरे एप्लिकेशन में एक कंसोल साझा किया जाता है।


1

"इसका उपयोग कब करें" के जवाब में? सवाल:

मैं अक्सर एक स्थिर उदाहरण (वर्ग) चर का उपयोग करके किसी कक्षा के प्रत्येक उदाहरण के लिए एक विशिष्ट उदाहरण ID प्रदान करता हूं। मैं हर कक्षा में समान कोड का उपयोग करता हूं, यह बहुत सरल है:

//Instance ID ----------------------------------------
    // Class variable holding the last assigned IID
    private static int xID = 0;
    // Lock to make threadsafe (can omit if single-threaded)
    private static object xIDLock = new object();
    // Private class method to return the next unique IID 
    //  - accessible only to instances of the class
    private static int NextIID()                    
    {
        lock (xIDLock) { return ++xID; }
    }
    // Public class method to report the last IID used 
    // (i.e. the number of instances created)
    public static int LastIID() { return xID; }
    // Instance readonly property containing the unique instance ID
    public readonly int IID = NextIID();
//-----------------------------------------------------

यह स्थिर चर और तरीकों के बारे में कुछ बिंदुओं को दिखाता है:

  1. स्थैतिक चर और विधियाँ वर्ग से जुड़ी होती हैं, वर्ग का कोई विशिष्ट उदाहरण नहीं।
  2. एक स्थिर विधि को उदाहरण के निर्माता के रूप में कहा जा सकता है - इस मामले में, स्थैतिक विधि NextIID का उपयोग पठनीय संपत्ति IID को आरंभ करने के लिए किया जाता है, जो इस उदाहरण के लिए विशिष्ट ID है।

मुझे यह उपयोगी लगता है क्योंकि मैं उन अनुप्रयोगों को विकसित करता हूं जिनमें वस्तुओं के झुंडों का उपयोग किया जाता है और यह सक्षम होना अच्छा है कि कितने निर्माण किए गए हैं, और व्यक्तिगत उदाहरणों को ट्रैक / क्वेरी करने में सक्षम हैं।

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


0

इसे सीधे कक्षा के नाम से बुलाने का प्रयास करें Book.myInt


ठीक है, ऊपर से @Kunal मुखर्जी उदाहरण देखें
leonidaa

0

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


0

आपको किसी वस्तु को तुरंत भेजने की आवश्यकता नहीं है, क्योंकि आप एक स्थिर चर का उपयोग करने जा रहे हैं: Console.WriteLine (Book.myInt);


-1

स्टेटिक वेरिएबल प्रोग्राम एक्जिट तक इसका पिछला मान रखता है। Static का उपयोग सीधे class_Name.Method () या class_Name.Property पर कॉल करके किया जाता है। किसी वस्तु संदर्भ की आवश्यकता नहीं है। स्थैतिक का सबसे लोकप्रिय उपयोग C # गणित वर्ग है। Math.Sin (), Math.Cos (), Math.Sqrt ()।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.