2012-05-29 20 views
77

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

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

दूसरी बात

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(); 
    } 
} 
+3

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

+0

जैसा कि हम कक्षा स्थिर int i = 5 –

+3

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

उत्तर

128

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 होगा। यह आसान है।

अब चलिए स्थिर चर देखें; मैं चर को 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 हो जाएगा। तो स्थैतिक चर मूल्य उस वर्ग के सभी उदाहरणों के बीच साझा किया जाता है।

+0

कि मैंने पहले ही अपने उत्तर में उल्लेख किया है ....... –

+7

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

+1

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

12

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

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

class myclass 
{ 
    public static int a = 0; 
} 

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

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

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

+0

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

+0

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

+0

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

8

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

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

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 कहेंगे

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

अपने आखिरी सवाल के बारे में है: आपको त्रुटि CS0176 संकलक करने के लिए बात कर रहे हैं। मैंने इस बारे में अधिक सूचनाओं को खोजने की कोशिश की है, लेकिन केवल क्या MSDN इसके बारे में कहना था मिल सकता है:

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

26

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

+1

अच्छी व्याख्या। – User

+0

इस उत्तर के लिए धन्यवाद। –

+2

ठीक है, प्रलेखन में यह कहा गया है "स्थिर संशोधक के साथ घोषित एक फ़ील्ड को स्थिर चर कहा जाता है।" https://msdn.microsoft.com/en-us/library/aa691162(v=vs.71).aspx लेकिन आप बाकी स्पष्टीकरण पर सही हैं। –

1

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

-1

प्रयास करें यह सीधे बुला वर्ग के नाम के साथ Book.myInt

1

स्टेटिक कक्षाएं उस वर्ग की एक वस्तु बनाने के लिए आप की आवश्यकता नहीं है/उन्हें का दृष्टांत, आप सी # कीवर्ड वर्ग के नाम के सामने स्थिर उपसर्ग कर सकते हैं, बनाने के लिए यह स्थिर है।

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

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(); 

    } 
} 
-1

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

0

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

मैं अक्सर कक्षा के प्रत्येक उदाहरण के लिए एक अद्वितीय उदाहरण आईडी असाइन करने के लिए एक स्थिर (वर्ग) चर का उपयोग करता हूं।

//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 को प्रारंभ करने के लिए उपयोग किया जाता है, जो इस उदाहरण के लिए अद्वितीय आईडी है।

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

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