मैं इस तरह एक PI निरंतर घोषित करने की कोशिश कर रहा हूँ:
public static const double PI = Math.PI;
लेकिन मुझे यह त्रुटि क्यों हो रही है?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
जवाबों:
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, वे टूट सकते हैं [ क्योंकि वे पिछले मूल्य का उपयोग जारी रखेंगे ]।
एक स्थिर परिभाषा से स्थिर है।
लगातार संकलन के दौरान, कोड में स्थिरांक को प्रतिस्थापित नहीं किया जा सकता है, इसलिए स्थैतिक बनाम उदाहरण परिभाषा के लिए कोई आवश्यकता नहीं है।
सभी स्थिरांक घोषणाएँ स्पष्ट रूप से स्थिर हैं, और C # विनिर्देश में कहा गया है कि (निरर्थक) स्थिर संशोधक का समावेश निषिद्ध है। मेरा मानना है कि यह भ्रम से बचने के लिए है जो तब हो सकता है जब एक पाठक को दो स्थिरांक देखने हों, एक को स्थैतिक घोषित किया जाए और एक को नहीं - वे आसानी से मान सकते हैं कि विनिर्देशन के अंतर से शब्दार्थ में अंतर आया। यह कहने के बाद कि, एक्सेस मोडिफ़ायर को निर्दिष्ट करने पर कोई प्रतिबंध नहीं है जो कि डिफ़ॉल्ट भी है, जहाँ कोई विकल्प है। उदाहरण के लिए, एक (ठोस) विधि को स्पष्ट रूप से निजी होने के बावजूद चिह्नित किया जा सकता है। नियम यह प्रतीत होता है कि जहां कोई विकल्प नहीं है (उदाहरण के लिए एक इंटरफ़ेस में एक विधि घोषणा) निरर्थक संशोधक निषिद्ध है। जहां कोई विकल्प है, इसकी अनुमति है।