C # में ग्लोबल वेरिएबल्स का उपयोग कैसे करें?


101

मैं एक चर की घोषणा कैसे करूं ताकि हर वर्ग (* .cs) बिना उदाहरण के संदर्भ में अपनी सामग्री तक पहुंच सके?

जवाबों:


123

में C#आप सच्चे वैश्विक चर को परिभाषित नहीं कर सकते हैं (इस अर्थ में वे किसी भी वर्ग से संबंधित नहीं हैं)।

यह कहा जा रहा है, इस सुविधा की नकल करने के लिए मुझे जो सबसे सरल तरीका पता है static class, वह इस प्रकार है:

public static class Globals
{
    public const Int32 BUFFER_SIZE = 512; // Unmodifiable
    public static String FILE_NAME = "Output.txt"; // Modifiable
    public static readonly String CODE_PREFIX = "US-"; // Unmodifiable
}

फिर आप अपने कोड में कहीं भी परिभाषित मान प्राप्त कर सकते हैं (बशर्ते वह उसी का हिस्सा हो namespace):

String code = Globals.CODE_PREFIX + value.ToString();

विभिन्न नामस्थानों से निपटने के लिए, आप या तो:

  • Globalsइसे बिना किसी वर्ग में शामिल किए एक विशिष्ट घोषित करें namespace(ताकि इसे वैश्विक अनुप्रयोग नामस्थान में रखा जाए);
  • दूसरे से चर प्राप्त करने के लिए निर्देश का उपयोग करके उचित डालें namespace

@Zarathos क्या कक्षा को भी स्थिर होना चाहिए?
कोसनकोव

4
वैसे यह आवश्यक नहीं है, लेकिन मैं यह नहीं देखता कि आपको इसे तुरंत क्यों करना चाहिए।
टॉमसो बेलुजो

यदि आपको इसकी प्रति परिभाषा "वैश्विक" नहीं करनी है, तो आवेदन राज्य का हिस्सा नहीं है
वाइकिंग

नमस्ते, अगर मैं कक्षा में स्थिर कीवर्ड नहीं लिखूंगा तो क्या अंतर होगा? मैंने केवल स्ट्रिंग FILE_NAME को स्थिर बनाया, मैंने कोशिश की और यह अभी भी मेरे लिए काम कर रहा है।
तोमर काहल

1
स्थिर विशेषता के बिना आपकी कक्षा तात्कालिक होगी (ग्लोबल्स जी = नई ग्लोबल्स ())। यह अंदर घोषित किए गए स्थिर चर के व्यवहार को नहीं बदलता है, लेकिन यह वास्तव में उपयोगी नहीं दिखता है।
टॉमासो बेलुज़ो

74

C # में ग्लोबल वैरिएबल जैसी कोई चीज नहीं है। अवधि।

यदि आप चाहते हैं तो आपके पास स्थैतिक सदस्य हो सकते हैं:

public static class MyStaticValues
{
   public static bool MyStaticBool {get;set;}
}

जबकि मैं सहमत हूं, क्या आप इस बात का विस्तार कर सकते हैं कि C # में वैश्विक चर जैसी कोई चीज क्यों नहीं है? मैं एक अच्छा कारण सोचने की कोशिश कर रहा था कि staticआपके द्वारा प्रदान किए गए बहुत ही उदाहरण को वास्तव में एक वैश्विक संस्करण नहीं माना जा सकता है।
cregox

3
@cawas क्योंकि एक "ग्लोबल वैरिएबल" (कहीं से लटकता हुआ, लिम्बो में तैरता हुआ, किसी भी वर्ग से संबंधित नहीं) की बहुत अवधारणा ओओपी की प्रकृति के खिलाफ जाती है। और C # सख्ती से ऑब्जेक्ट ओरिएंटेड है।
फेडेरिको बेरसेगेटुई

हां, यह पूरी अवधारणा है, जिससे मैं सहमत हूं। लेकिन उस स्थिर सदस्य को बनाकर आपने एक प्रकार का वैश्विक संस्करण तैयार कर लिया। आपके द्वारा कहा गया वैश्विक संस्करण कैसे अलग है? मैं एक व्यावहारिक उदाहरण देखना चाहूंगा।
cregox

1
मुझे ऐसा लग रहा है कि आप या तो मेरे सवाल का जवाब दे रहे हैं या मैं स्पष्ट नहीं हूं। लेकिन मुझे इसका जवाब पहले ही मिल गया। यहाँ: stackoverflow.com/a/20010543/274502
cregox

7
मुझे अब एहसास हुआ कि मेरा मतलब यह है कि स्थिर सदस्य वैचारिक और व्यावहारिक रूप से वैश्विक संस्करण हैं (शायद उस ढेर बात को छोड़कर , जो केवल तब तक फर्क करता है जब तक कि आप असुरक्षित कोड नहीं लिख रहे हों या अनवांटेड कोड के साथ किसी तरह का भारी अंतर कर रहे हों )। इसलिए मुझे नहीं पता कि कोई यह क्यों कहेगा कि " व्हाट्सएप में ग्लोबल वैरिएबल जैसी कोई चीज नहीं है "। इसने मुझे बहुत भ्रमित किया।
cregox

23

पहले जाँच करें कि क्या आपको वास्तव में अपने सॉफ्टवेयर आर्किटेक्चर पर विचार किए बिना इसका उपयोग करने के बजाय एक वैश्विक चर की आवश्यकता है।

मान लेते हैं कि यह परीक्षा उत्तीर्ण है। उपयोग के आधार पर, ग्लोबल्स को दौड़ की स्थिति और कई अन्य "बुरी चीजों" के साथ डिबग करना मुश्किल हो सकता है, यह उन कोणों से संपर्क करना सबसे अच्छा है जहां आप ऐसी बुरी चीजों को संभालने के लिए तैयार हैं। इसलिए,

  1. ऐसे सभी ग्लोबल वैरिएबल्स को एक ही staticक्लास (मैनगैबिलिटी के लिए) में लपेटें ।
  2. खेतों के बजाय गुण (= 'चर')। इस तरह आपके पास भविष्य में ग्लोबल्स के समवर्ती लेखन के साथ किसी भी मुद्दे को संबोधित करने के लिए कुछ तंत्र हैं।

ऐसे वर्ग के लिए मूल रूपरेखा होगी:

public class Globals
{
    private static bool _expired;
    public static bool Expired 
    {
        get
        {
            // Reads are usually simple
            return _expired;
        }
        set
        {
            // You can add logic here for race conditions,
            // or other measurements
            _expired = value;
        }
    }
    // Perhaps extend this to have Read-Modify-Write static methods
    // for data integrity during concurrency? Situational.
}

अन्य वर्गों से उपयोग (एक ही नाम स्थान के भीतर)

// Read
bool areWeAlive = Globals.Expired;

// Write
// past deadline
Globals.Expired = true;

4

इसके लिए एक उपयोगी विशेषता है using static

जैसा कि दूसरों ने कहा है, आपको अपने ग्लोबल्स के लिए एक वर्ग बनाना होगा:

public static class Globals {
    public const float PI = 3.14;
}

लेकिन आप इसे इस तरह से आयात कर सकते हैं ताकि इसके स्थिर गुणों के सामने वर्ग का नाम न लिखा जा सके:

using static Globals;
[...]
Console.WriteLine("Pi is " + PI);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.