स्थैतिक को स्थैतिक के रूप में चिह्नित नहीं किया जा सकता है


96

मैं इस तरह एक PI निरंतर घोषित करने की कोशिश कर रहा हूँ:

public static const double PI = Math.PI;

लेकिन मुझे यह त्रुटि क्यों हो रही है?

The constant 'Calendar.NewCalendar.PI' cannot be marked static

1
संभावित डुप्लिकेट stackoverflow.com/questions/408192/...
himanshupareek66

जवाबों:


197

constतात्पर्य static(आपको constमूल्य को संदर्भित करने के लिए एक उदाहरण की आवश्यकता नहीं है )।

मैं इस महत्वपूर्ण बिंदु को भी जोड़ना चाहता हूं: जब आप किसी असेंबली के विरुद्ध (संदर्भ) ए के साथ लिंक करते हैं public const, तो उस मान को आपकी असेंबली में कॉपी किया जाता है। इसलिए यदि constसंदर्भित विधानसभा में मूल्य बदलता है, तो आपकी विधानसभा में अभी भी मूल रूप से संकलित-मूल्य होगा।

यदि यह व्यवहार स्वीकार्य नहीं है, तो आपको क्षेत्र को एक public static readonlyक्षेत्र बनाने पर विचार करना चाहिए ।

Lib.dll, बाइनरी के रूप में प्रदान किया गया:

public class Foo {
    public const int HATS = 42;
    public static readonly int GLOVES = 33;
}

App.exe, संदर्भ Lib.dll:

Foo.HATS    // This will always be 42 even if the value in Lib.dll changes,
            // unless App.exe is recompiled.

Foo.GLOVES  // This will always be the same as Foo.GLOVES in Lib.dll

से MSDN :

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

से DotNetPerls :

DLLs। जब आप किसी constफ़ील्ड या डिक्लेरेशन का उपयोग करते हैं , तो C # कंपाइलर वास्तव constमें IL कोड में वेरिएबल की वैल्यू को सीधे एम्बेड करता है । इसलिए, यह अनिवार्य constरूप से एक अलग इकाई के रूप में मिटा देता है ।

सावधानी: यदि वे प्रोग्राम जो मूल्य में बदलाव के constबाद recompiled नहीं हैं const, वे टूट सकते हैं [ क्योंकि वे पिछले मूल्य का उपयोग जारी रखेंगे ]।


15

एक स्थिर परिभाषा से स्थिर है।


यह जावा में `अंतिम` पर भी लागू किया जाता है
बशीर अल-मोमानी

@ बशीरलाल-मोमानी: नहीं। एक अंतिम निर्माणकर्ता के कॉल के बाद बस अपरिवर्तनीय है। और कुछ नहीं।
juergen d

9

आपके पास स्थिर गति नहीं हो सकती। कॉन्स्ट के बजाय आसानी से आज़माएं या "स्थैतिक" को छोड़ दें क्योंकि "कॉन्स्ट" का अर्थ वैसे भी स्थिर है।


4

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


3

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

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