मुझे अपनी कक्षा में "सार्वजनिक स्थैतिक कॉन्स्टेंस स्ट्रिंग S =" सामान क्यों नहीं मिल सकता है?


321

अपनी कक्षा को संकलित करने का प्रयास करने पर मुझे एक त्रुटि मिलती है:

निरंतर 'NamespaceName.ClassName.CONST_NAME'उल्लेखनीय स्थिर नहीं हो सकता।

लाइन पर:

public static const string CONST_NAME = "blah";

मैं यह सब जावा में कर सकता था। मैं क्या गलत कर रहा हूं? और यह मुझे ऐसा करने क्यों नहीं देता?

जवाबों:


583

एक constवस्तु हमेशा होती है static


2
const वैरिएबल को स्थिर बनाता है और इसे बदला नहीं जा सकता है।
शमूएल

6
@ जिंगयू: कास्ट का अर्थ है स्थैतिक - यदि आपके पास कोई कास्ट है, तो यह पहले से ही स्टैटिक है, और स्टैटिक इसलिए इसे निर्दिष्ट करने की आवश्यकता नहीं है और न ही इसे निर्दिष्ट किया जा सकता है।
जॉन रुडी

8
@jjnguy: क्यों? वेरिएबल्स के लिए जावा के फाइनल से पठनीय वास्तव में अधिक लचीला है - आप इसे कंस्ट्रक्टर में जितनी बार चाहें उतनी बार सेट कर सकते हैं, लेकिन कहीं और नहीं। यह बहुत आसान हो सकता है।
जॉन स्कीट

67
संकलन समय पर संकलित होते हैं और स्थैतिक प्रकार की वस्तु में रनटाइम में मौजूद नहीं होते हैं। स्टैटिस्टिक इनबिल्ड नहीं हैं और टाइप ऑब्जेक्ट के अंदर रहते हैं। मैं इसे सिर्फ इसलिए जोड़ता हूं क्योंकि किसी ने भी अंतर का उल्लेख नहीं किया है ...

3
वे अभी भी निष्पादन समय पर मौजूद हैं - आप उन्हें प्रतिबिंब के साथ प्राप्त कर सकते हैं, उदाहरण के लिए (गेटफिल्ड के साथ)।
जॉन स्कीट

98

से सी # भाषा विनिर्देश (पीडीएफ पृष्ठ 287 - या पीडीएफ की 300 वीं पेज):

भले ही स्थिरांक को स्थिर सदस्य माना जाता है, एक स्थिर घोषणा को न तो स्थिर संशोधन की आवश्यकता होती है और न ही।


2
यहाँ भी उपलब्ध है: msdn.microsoft.com/en-us/library/aa645749(VS.71).aspx
Lasse V. Karlsen

32

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

दूसरे शब्दों में, एक मान सदस्य जिसमें 10 का मान है, वह कोड में संकलित हो सकता है जो इसे कॉन्स्टेबल सदस्य के संदर्भ के बजाय 10 नंबर के रूप में उपयोग करता है।

यह एक स्थिर पठनीय क्षेत्र से अलग है, जिसे हमेशा क्षेत्र के संदर्भ के रूप में संकलित किया जाएगा।

ध्यान दें, यह प्री-जेआईटी है। जब JIT'ter खेल में आता है, तो यह इन दोनों को मान के रूप में लक्ष्य कोड में संकलित कर सकता है।


बहुत महत्वपूर्ण बिंदु, कि संकलित कोड मान लेता है कि निरंतर मूल्य भविष्य के संस्करण में नहीं बदलेगा।
PJTraill

6

C # का constजावा के समान सटीक है final, सिवाय इसके कि यह हमेशा होता है static। मेरी राय में, एक constचर के लिए वास्तव में गैर होना आवश्यक नहीं है static, लेकिन यदि आपको एक constचर को गैर- तक पहुँच की आवश्यकता है static, तो आप यह कर सकते हैं:

class MyClass
{    
    private const int myLowercase_Private_Const_Int = 0;
    public const int MyUppercase_Public_Const_Int = 0;

    /*        
      You can have the `private const int` lowercase 
      and the `public int` Uppercase:
    */
    public int MyLowercase_Private_Const_Int
    {
        get
        {
            return MyClass.myLowercase_Private_Const_Int;
        }
    }  

    /*
      Or you can have the `public const int` uppercase 
      and the `public int` slighly altered
      (i.e. an underscore preceding the name):
    */
    public int _MyUppercase_Public_Const_Int
    {
        get
        {
            return MyClass.MyUppercase_Public_Const_Int;
        }
    } 

    /*
      Or you can have the `public const int` uppercase 
      and get the `public int` with a 'Get' method:
    */
    public int Get_MyUppercase_Public_Const_Int()
    {
        return MyClass.MyUppercase_Public_Const_Int;
    }    
}

ठीक है, अब मुझे पता है कि यह सवाल 4 साल पहले पूछा गया था, लेकिन जब से मैंने लगभग 2 घंटे काम किया, जिसमें सभी तरह के जवाब देने और कोड स्वरूपण के सभी तरीकों की कोशिश करना शामिल था, इस जवाब में, मैं अभी भी इसे पोस्ट कर रहा हूं। :)

लेकिन, रिकॉर्ड के लिए, मैं अभी भी थोड़े मूर्खतापूर्ण महसूस करता हूं।


4
जहाँ तक मैं बता सकता हूँ, जावा finalबिल्कुल C # की तरह व्यवहार करता है readonly, और बिल्कुल भी पसंद नहीं constकरता है।
बेन वोइग्ट

@jjnguy संपादन के लिए धन्यवाद; मैं वास्तव में नहीं जानता कि मैंने उस मूल शब्द को क्यों चुना।
मेवमोरिटस

6

MSDN से: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

... इसके अलावा, एक कांस्टेबल क्षेत्र एक संकलन-समय स्थिरांक है , फिर भी रैंडम कॉन्स्टेंट के लिए आसानी से उपयोग किया जा सकता है ...

तो कास्ट क्षेत्रों में स्थैतिक का उपयोग करना C / C ++ में एक परिभाषित (#define के साथ) को स्थिर बनाने की कोशिश करने जैसा है ... चूंकि इसे संकलन के समय में इसके मूल्य के साथ बदल दिया जाता है, इसलिए यह सभी उदाहरणों (= static) के लिए एक बार शुरू किया जाता है। ।


2

const स्थिर के समान है हम वर्ग नाम के साथ दोनों चर का उपयोग कर सकते हैं, लेकिन अंतर स्थैतिक चर को संशोधित किया जा सकता है और const नहीं कर सकते हैं।

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