सी # कंपाइलर के लिए एक संरचना प्रकार के const
मूल्य का उत्पादन करने के लिए यह पता होना चाहिए कि इसके सभी क्षेत्रों में मूल्यों को क्या जाना चाहिए। सी # कंपाइलर आंतरिक रूप से जानता है कि Decimal
जैसे कुछ प्रकार के क्षेत्रों को कैसे प्रारंभ किया जाए, लेकिन अधिकांश मूल्य प्रकारों के लिए इसका कोई ज्ञान नहीं है।
एक कंपाइलर के लिए संदर्भों में संरचना प्रकार के निरंतर मूल्यों को घोषित करने का साधन प्रदान करना संभव होगा जहां struct
फ़ील्ड का खुलासा किया गया था। यदि संरचना का क्षेत्र private
था, तो उस प्रकार के स्थिरांक को केवल संरचना के भीतर घोषित किया जा सकता था; यदि फ़ील्ड internal
थे, तो असेंबली के भीतर कहीं भी स्थिरांक घोषित किया जा सकता था; यदि public
, उन्हें कहीं भी घोषित किया जा सकता है।
हालांकि मैं ऐसी सुविधा देखना चाहता हूं, मुझे किसी भी मुख्यधारा के .NET भाषाओं को लागू करने की उम्मीद नहीं है। कंपाइलर के स्वाभाविक रूप से जानता है कि प्रकार के स्थिरांक अन्य निरंतर अभिव्यक्तियों में भाग ले सकते हैं, जबकि static readonly
चर नहीं कर सकते हैं। यदि NumRows
4 के बराबर स्थिर है, तो Arr[3*NumRows+7]
जैसी अभिव्यक्ति को Arr[19]
द्वारा प्रतिस्थापित किया जा सकता है भले ही NumRows
किसी बाहरी असेंबली में परिभाषित किया गया हो।यह ऐसे स्थिरांक को static readonly
चर से अधिक लाभ प्रदान करता है। यदि, हालांकि, स्थिरता एक प्रकार का है जो एक कंपाइलर आंतरिक रूप से पहचान नहीं लेता है, तो किसी भी निरंतर अभिव्यक्ति में भाग लेने की बहुत सीमित क्षमता होगी, जो पहले स्थान पर स्थिर होने के लाभ को प्रभावी ढंग से अस्वीकार कर देगी। यदि एक मूल्य-प्रकार निरंतर एक खुला क्षेत्र था, तो एक कंपाइलर के लिए निरंतर के रूप में उस क्षेत्र के मूल्य का उपयोग करना संभव होगा, लेकिन चूंकि .NET भाषाओं के निर्माता दार्शनिक रूप से खुला क्षेत्रों के साथ संरचनाओं का विरोध कर रहे हैं, तो मुझे उम्मीद नहीं होगी उन्हें इस तरह के उपयोग की इजाजत देने के लिए भी अगर वे कर सकते हैं।
static readonly
चर से अधिक स्थिरांक के पक्ष में कुछ संभावित उपयोग मामले होंगे, लेकिन ऐसे कई मामलों को मौजूदा प्रकारों का उपयोग करके स्वीकार्य रूप से संभाला जा सकता है। उदाहरण के लिए, एक लाइब्रेरी const Int64
को अपने संस्करण के बारे में जानकारी एन्कोड करने के लिए उजागर कर सकती है, और उस मान का उपयोग GetLinkedVersionInfo
विधि के लिए डिफ़ॉल्ट पैरामीटर मान के रूप में करें। प्रश्न में मूल्य कॉलिंग कोड को "बेक किया गया" जब संकलित किया गया था, इस प्रकार विधि को यह रिपोर्ट करने की इजाजत दी गई कि लाइब्रेरी के किस संस्करण के साथ कॉलर लिंक किया गया था, और संभावित रूप से यह पहचानने की अनुमति है कि संस्करण के साथ कोई संगतता समस्या है या नहीं।
आप structs const घोषित कर सकते हैं। कक्षाएं और structs विनिमय करने योग्य हैं, और यह कक्षाओं के लिए काम करता है। – templatetypedef
@templatetypedef: क्या मैं "शून्य से अलग" का उल्लेख करूंगा। – Lazlo
@templatetypedef: मुझे यकीन नहीं है कि आप सी # का किस संस्करण का उपयोग कर रहे हैं, लेकिन यह मैंने देखा है कि किसी भी संस्करण पर यह सच नहीं है। – cdhowie