सार्वजनिक स्थिरांक "खराब" है?


38

क्या इस:

public MyClass
{
    public const string SomeString = "SomeValue";
}

इससे भी बदतर:

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

दोनों को एक ही तरह से संदर्भित किया जा सकता है:

if (someString == MyClass.SomeString)
     ...

हालांकि दूसरी को संपत्ति होने का संरक्षण प्राप्त है। लेकिन वास्तव में यह एक कास्ट से कितना बेहतर है?

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

कोई विचार?


1
इस तरह से उपयोग किए जाने वाले सार्वजनिक स्थिरांक ठीक हैं। इस तरह से गुणों का उपयोग करना ओवरकिल है।
बर्नार्ड

2
क्या आपने रीडोनली कीवर्ड का उपयोग करने पर विचार किया है ? कई पोस्ट्स में बताई गई समस्याओं के बिना ReadOnly आपको एक कॉन्स्टेंट का क्लीनर सिंटेक्स देता है।
मैट रफ़ेल

भी कर सकता है ... सार्वजनिक स्थैतिक आसानी से टाइप करें स्थिर नाम = 0;
स्नूप

जवाबों:


56

C # में इस थ्रेड में वर्णित कारणों में से कोई भी कारण बहुत खराब है।

C # में सार्वजनिक स्थिरांक को संदर्भित असेंबलियों में बेक किया जाता है। मतलब, अगर आपके पास एक अलग असेंबली में SomeOtherClass है, जो MyClass में SomeString का संदर्भ देता है, तो SomeOtherClass के लिए जनरेट किए गए CIL में एक हार्डकोड "SomeValue" स्ट्रिंग होगा।

यदि आप Dll को पुनः प्राप्त करने के लिए जाते हैं, जिसमें MyClass है, लेकिन SomeOtherClass नहीं है और कॉन्स्टेंस को नहीं बदला है, तो SomeOtherClass में वह नहीं होगा जो आप सोचते हैं कि यह होगा - इसमें मूल मान होगा।

यदि आप 100% सकारात्मक हैं तो यह पाई की तरह एक सार्वभौमिक स्थिरांक है, पागल हो जाओ; अन्यथा सावधानी से चलें।

यहाँ एक बेहतर व्याख्या है: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly


3
@Oded, लेकिन समान अंतर constकेवल और केवल पढ़ने वाली संपत्ति के बीच है। constकॉलिंग असेंबली में बेक किया गया है, केवल पढ़ने के लिए संपत्ति नहीं है।
२१:

1
यह कुछ ऐसा है जो मुझे नहीं पता था। यह और सबूत है कि सार्वजनिक क्षेत्र खराब हैं। मुझे लगता है कि पाई का "सुरक्षित" उदाहरण भी एक बुरा विचार है (क्या होगा जब कोई डेवलपर पाई पर सटीक के कम या ज्यादा अंक चाहता है? और इस मुद्दे को जाने बिना विधानसभा में बदलाव करता है।) मेरे पास 40+ विधानसभाएं हैं। समाधान और मैं देख सकता हूं कि अगर हम सावधान नहीं हैं तो यह वास्तव में हमें काट सकता है।
११:१३ बजे वेकैनो

2
क्या यह "कॉपी" C # के किसी अन्य भाग में होता है? (अर्थात
एनम

2
हां, नकल होती है। यह आमतौर पर कोई समस्या नहीं है, लेकिन यदि आपका कोड किसी Enum के संख्यात्मक मान का उपयोग करता है और इसे इस प्रश्न में उल्लिखित तरीके से बदल दिया जाता है, तो यह समस्या पैदा कर सकता है।
21

1
यह constC # में गूंगा होने का एक मुख्य कारण है। हमें
इम्यूटेबल्स के

22

किसी प्रॉपर्टी में फील्ड बदलना एक ब्रेकिंग चेंज है। आप द्विआधारी, स्रोत और प्रतिबिंब संगतता खो देते हैं।

के अतिरिक्त:

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

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

सभी ने कहा, मैं यह नहीं देखता कि कॉन्स्टेंट वास्तव में इससे कैसे प्रभावित होते हैं (खासकर यदि आपको उपरोक्त सुविधाओं में से किसी की भी आवश्यकता नहीं है), जब तक कि आपका एपीआई इस तरह से नहीं बदलता है कि वे अब स्थिरांक नहीं हैं।


11

सार्वजनिक क्षेत्रों की गड़बड़ी इस तथ्य में है कि वे परिवर्तनशील हैं और यह कि उन पर लागू कार्यान्वयन परिवर्तन के अधीन है।

जब यह आता है तो यह constआम तौर पर एक मुद्दा नहीं है (सार्वजनिक रूप से गणना के समान) - जब तक आप यह नहीं सोचते कि constवसीयत को अंतिम रूप दिया जाएगा और आपको कुछ समय में एक्सेसर के आसपास एनकैप्सुलेशन की आवश्यकता होगी (यह कहने के लिए लॉग इन करें कि इसे कितनी बार देखा गया था अप), आप इसे जनता के रूप में भी रख सकते हैं const


1

एक स्थिरांक डेटा है। गुण व्यवहार की संभावना को तब महत्व देते हैं जब आप मूल्य पर "दिखते" हैं।

निरंतर डेटा के साथ बंडलिंग व्यवहार (या भविष्य की संभावना) गलत है। अधिकांश प्रणालियों के लिए यह वास्तव में मायने नहीं रखेगा, लेकिन यह हो सकता है।

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

क्लाइंट प्रोग्रामर एक निरंतरता की सुरक्षा को भी खो सकते हैं क्योंकि भाषा उन्हें अपने डुप्लिकेट स्थिरांक में एक संपत्ति मूल्य प्रदान करने की अनुमति नहीं दे सकती है।

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

सही निरंतर डेटा को एनकैप्सुलेशन की आवश्यकता नहीं है या नहीं चाहिए।

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