स्थिरांक के एक समूह को संग्रहीत करने का सबसे अच्छा तरीका क्या है जो मेरे कार्यक्रम का उपयोग करता है? [बन्द है]


97

मेरे पास विभिन्न स्थिरांक हैं जो मेरे कार्यक्रम का उपयोग करते हैं ... string' ints, double' s, आदि ... उन्हें संग्रहीत करने का सबसे अच्छा तरीका क्या है? मुझे नहीं लगता कि मैं एक चाहता हूं Enum, क्योंकि डेटा सभी एक ही प्रकार नहीं है, और मैं प्रत्येक मूल्य को मैन्युअल रूप से सेट करना चाहता हूं। क्या मुझे उन सभी को एक खाली वर्ग में संग्रहीत करना चाहिए? या कोई बेहतर तरीका है?


18
किसी भी तरह से आप इसे चाहते हैं-जिस तरह से आपको इसकी आवश्यकता है।
सैन जैसिंटो

जवाबों:


135

आप शायद उन्हें स्थैतिक कक्षा में, केवल स्थैतिक पढ़ने-योग्य गुणों के साथ रख सकते हैं।

public static class Routes
{
    public static string SignUp => "signup";
}

23
+1, लेकिन इससे भी बेहतर अगर आप स्थानीयकरण के लिए संसाधन फ़ाइल से इन्हें खींच सकते हैं।
जोएल कोएहॉर्न

17
थोड़ा सा बुरा लगता है - क्यों नहीं स्थिर आसानी से तार?
खाली

6
क्यों नहीं पढ़ा और कांस्टेबल नहीं? आप रनटाइम पर मान सेट नहीं कर रहे हैं, इसलिए उन्हें आसानी से पढ़ने की आवश्यकता नहीं है।
फिलिप वालेस

91
कॉन्स्ट के साथ समस्या यह है कि कॉन्स के खिलाफ संकलित किसी भी असेंबली को उन कॉन्स की स्थानीय प्रतियां मिलती हैं जब वे स्वयं संकलित होते हैं; इसलिए यदि आप एक मूल्य बदलते हैं तो आपको असेंबली को परिभाषित करने वाली अपनी विधानसभा पर निर्भर सभी असेंबली को फिर से खोलना होगा - इसलिए इसका अक्सर पठनीय मार्ग पर जाना सुरक्षित होता है। सार्वजनिक स्थैतिक मूल्यों के बजाय गुण आपको भविष्य में कुछ प्रोग्रामिंग लॉजिक जोड़ने की सुविधा देता है यदि आपको अपने निरंतर मूल्यों के इंटरफ़ेस को बदले बिना इसकी आवश्यकता है (अर्थात स्थानीयकरण से पढ़ें)।
cfeduke

11
शैतान के वकील के रूप में मुझे यह बताना चाहिए कि कास्ट के साथ लाभ यह है कि आप इसे स्विच मामलों में उपयोग कर सकते हैं।
अरविमान

27

स्थिरांक से भरे वर्ग का उपयोग करने वाला IMO स्थिरांक के लिए ठीक है। यदि वे अर्ध-कभी-कभी बदलते हैं, तो मैं आपके कॉन्फ़िगरेशन और इसके बजाय कॉन्फ़िगरेशन प्रबंधक वर्ग में AppSettings का उपयोग करने की सलाह देता हूं।

जब मेरे पास "स्थिरांक" होते हैं जो वास्तव में AppSettings से खींचे जाते हैं या इसी तरह के मैं अभी भी हमेशा एक "स्थिरांक" वर्ग होता है जो कॉन्फ़िगरेशन प्रबंधक से रीडिंग को लपेटता है। किसी भी स्थान पर Constants.SomeModule.Settingसीधे उपयोग करने के बजाय यह हमेशा अधिक सार्थक ConfigurationManager.AppSettings["SomeModule/Setting"]है कि कहा गया मूल्य निर्धारित करना चाहते हैं।

इस सेटअप के लिए बोनस अंक, चूंकि SomeModuleकॉन्स्टेंट फ़ाइल के अंदर एक नेस्टेड क्लास होगा, आप आसानी से डिपेंडेंसी इंजेक्शन का उपयोग कर सकते हैं ताकि SomeModuleसीधे उस पर निर्भर होने वाली कक्षाओं में सीधे इंजेक्ट किया जा सके । आप इसके शीर्ष पर एक इंटरफ़ेस भी निकाल सकते हैं SomeModuleऔर फिर ISomeModuleConfigurationअपने उपभोग कोड में एक निर्भरता पैदा कर सकते हैं, यह तब आपको कॉन्स्टेंट फ़ाइलों पर निर्भरता को कम करने की अनुमति देगा, और यहां तक ​​कि संभावित रूप से परीक्षण को आसान बना देगा, खासकर अगर ये सेटिंग AppSignings और से आती हैं आप उन्हें कॉन्फ़िगरेशन परिवर्तनों का उपयोग करके बदलते हैं क्योंकि सेटिंग्स पर्यावरण विशिष्ट हैं।


1
बस इसे जोड़ने के लिए: कारण यह है कि जब आप निर्माण करते हैं, तो अन्य विधानसभाओं से उपयोग किए जाने वाले स्थिरांक अपडेट नहीं होते हैं। इसका मतलब यह है कि अगर आपके पास असेम्बली और असेम्बली है और बी ए से एक स्थिरांक का उपयोग करता है, तो मूल्य कॉपी किया जाता है, संदर्भित नहीं होता है, इसलिए ए का पुनः निर्माण करना बी को अपडेट नहीं करेगा। इससे अजीब बग पैदा हो सकते हैं।
कैमिलो मार्टिन

1
@CamiloMartin को संभालने के लिए बहुत सारे तरीके, आपके "स्थिरांक" उस से बचने के लिए सिर्फ स्थैतिक रीडोनॉइल कर सकते हैं, या जैसा कि मैंने कहा कि अगर वे एक से अधिक बार एक नीला चाँद में एक से अधिक बार विन्यास प्रबंधक का उपयोग करते हैं।
क्रिस मैरिकिक

हां, मैं सिर्फ यह कह रहा था कि यह सिर्फ इसलिए नहीं है क्योंकि यह एक ऐसा सम्मेलन है जिसमें आपको स्थैतिक रूप से उपयोग करना चाहिए, लेकिन क्योंकि यह वास्तव में भ्रम का स्रोत हो सकता है। इसके अलावा, विन्यास प्रबंधक का एक विकल्प संसाधन फाइलें है - आपको बस नाम में एक भाषा कोड के साथ एक और संसाधन फ़ाइल को जोड़ना होगा और आपका कोड तुरन्त स्थानीयकृत हो जाएगा।
कैमिलो मार्टिन

समस्या यह है कि जब आप अन्य विधानसभाओं से विधानसभा इस संदर्भ है, तो आप अपने config फाइलों में मूल्यों की नकल करने के लिए होता है
symbiont

@symbiont आप कॉन्फिग फाइलों को एम्बेड कर सकते हैं और यदि आप चाहते हैं, तो उन्हें 3 जी पार्टी कंपोनेंट के रूप में छायांकन के लिए प्रकट कर सकते हैं
क्रिस मैरिसिक

19

मुझे जो करना पसंद है वह निम्नलिखित है (लेकिन उचित प्रकार के स्थिरांक का उपयोग करने के लिए अंत तक पढ़ना सुनिश्चित करें ):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}

यह जानने के लिए पढ़ेंconst कि आप जो चाहते हैं वह क्यों नहीं हो सकता है। स्थिरांक के संभावित प्रकार हैं:

  • constखेत। यदि भविष्य में मान बदल सकता है तो विधानसभाओं ( publicया protected) का उपयोग न करें क्योंकि उन विधानसभाओं में मूल्य संकलन-समय पर हार्डकोड किया जाएगा। यदि आप मान बदलते हैं, तो पुराने मान अन्य असेंबली द्वारा तब तक उपयोग किए जाएंगे जब तक वे पुन: संकलित नहीं हो जाते।
  • static readonly खेत
  • static बिना संपत्ति set

1
अगर कई विधानसभाओं में इस्तेमाल किया जाए तो आसानी से क्यों?
फिलिप वालेस

स्थैतिक, स्थैतिक की तुलना में स्थैतिक रूप से कई विधानसभाओं में बेहतर क्यों काम करता है?
मैथ्यू

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


11

यह IMO का सबसे अच्छा तरीका है। गुणों की आवश्यकता नहीं, या आसानी से:

public static class Constants
{
   public const string SomeConstant = "Some value";
}

9
यदि आप कास्ट का उपयोग करने जा रहे हैं, तो केवल आंतरिक रूप में बेनकाब करें। कॉन्स्टेंट को सार्वजनिक न करें (भले ही आपको लगता है कि आपकी असेंबली आपके संगठन के लिए बाहरी उपयोग नहीं होने जा रही है)। इसके अलावा गुण आपको अपने इंटरफ़ेस को फिर से परिभाषित करने की आवश्यकता के बिना भविष्य के विस्तार के लिए प्रोग्रामेटिक लचीलापन देते हैं।
cfeduke

4

एक खाली स्थिर वर्ग उपयुक्त है। कई वर्गों का उपयोग करने पर विचार करें, ताकि आप संबंधित स्थिरांक के अच्छे समूहों के साथ समाप्त हो जाएं, न कि एक विशाल ग्लोबल्स.केएस फ़ाइल।

इसके अतिरिक्त, कुछ अंतर स्थिरांक के लिए, संकेतन पर विचार करें:

[Flags]
enum Foo
{
}

जैसा कि यह झंडे जैसे मूल्यों के इलाज के लिए अनुमति देता है ।


"कई वर्गों का उपयोग करने पर विचार करें, ताकि आप संबंधित स्थिरांक के अच्छे समूहों के साथ समाप्त हो जाएं, न कि एक विशालकाय ग्लोबाल्स.एक्स फ़ाइल।" मेरा मानना ​​है कि यह सबसे अच्छी सिफारिश है, क्या इसके आसपास कुछ डिज़ाइन पैटर्न नहीं हैं? मैं किसी भी नाम से नहीं जानता, क्या आप?
ग्रैग

3

Web.config या app.config का उपयोग करने के लिए एक और वोट। कॉन्‍फ़‍िगरेशन फ़ाइलों में कॉन्‍टेंट के लिए एक अच्‍छी जगह है जैसे कि कनेक्‍शन स्‍ट्रिंग्स आदि, मैं इस प्रकार की चीजों को देखने या संशोधित करने के लिए स्रोत को देखना पसंद नहीं करता। एक स्थिर वर्ग जो एक .config फ़ाइल से इन स्थिरांक को पढ़ता है, एक अच्छा समझौता हो सकता है, क्योंकि यह आपके आवेदन को इन संसाधनों तक पहुंचने देगा क्योंकि वे कोड में परिभाषित किए गए थे, लेकिन फिर भी आप उन्हें आसानी से देखने योग्य / संपादन योग्य होने का लचीलापन देते हैं अंतरिक्ष।


2
एक कनेक्शन स्ट्रिंग एक स्थिर नहीं है, यह एक सेटिंग है। यह हो सकता है कि ओपी वास्तव में स्थिरांक के बजाय सेटिंग्स का भी मतलब है, लेकिन मुझे इसके लिए कोई सबूत नहीं दिखता है।
जॉन स्कीट

क्षमा करें मैं असहमत हूं। स्ट्रिंग शाब्दिक परिभाषा द्वारा स्थिरांक हैं। एक कॉन्फ़िगर फ़ाइल में स्ट्रिंग को बदलना कोड में इसे बदलने और पुन: जमा करने के लिए लगभग बराबर है; चाहेंगे कि यह एक निरंतर नहीं है? मुझे ऐसा नहीं लगता।
डी एनवी

2
@ डेविड - सच नहीं है। एक कंपाइलर को इस बात की परवाह नहीं है कि आपकी कॉन्फ़िग फ़ाइल में आपका क्या मूल्य है - यह रनटाइम पर पढ़ा जाता है।
फिलिप वालेस

@PipipW मैं समझता हूँ कि। मेरा कहना था कि (जॉन स्कीट की टिप्पणी के जवाब में) एक विशिष्ट कनेक्शन स्ट्रिंग एक स्थिर है, जैसा कि सभी स्ट्रिंग शाब्दिक हैं। तथ्य यह है कि एक "स्थिर" को बदला जा सकता है - यह हो सकता है कि कॉन्फिग फ़ाइल को संशोधित करके, और आपके ऐप ने नई मान को उक्त कॉन्फिग फ़ाइल से खींच लिया है, या कोड में शाब्दिक को बदलकर जिसे एक recompile / तैनाती की आवश्यकता होगी - नहीं करता है। इसे "सेटिंग" बनाएं। स्ट्रिंग अपने कंटेनर की परवाह किए बिना निरंतर है। मैं समझता हूं और आपकी बात से सहमत हूं - यह सिर्फ वही नहीं था जो मैं कह रहा था।
डीवे

1
मेरे अनुभव में, अप्रत्याशित भविष्य में कुछ बिंदु पर, आपके "निरंतर" मूल्य को बदलने की आवश्यकता होगी, भले ही आपने सोचा था कि यह एक मिलियन वर्षों में कभी नहीं होगा। मुझे लगता है कि स्रोत कोड को बदलने की तुलना में .config फ़ाइल में ऐसा करना बहुत आसान है। सब कुछ अंत में एक सेटिंग होने के नाते समाप्त होता है।
निंजाबॉम्ब

1

हां, static classस्थिरांक के लिए एक स्थिरांक ठीक होगा, केवल स्थिरांक के अलावा जो विशिष्ट प्रकार से संबंधित हैं।


ठीक यही मैं करने की कोशिश कर रहा हूँ। मैं उन्हें उस वर्ग के सदस्यों के रूप में दिखाना चाहता हूं, जिसके लिए वे हैं। लेकिन मैं उन्हें कक्षाओं में जोड़ना नहीं चाहता, क्योंकि कॉन्स्टेंट कंपनी के आधार पर अलग-अलग होते हैं क्योंकि मैं काम कर रहा हूं। मुझे एक्सटेंशन स्थिरांक या गुणों के बारे में अभी तक कुछ नहीं मिला है। लेकिन मैं इस विचार का परित्याग कर सकता हूं क्योंकि मैं नहीं चाहता कि जब मैं इन वर्गों को क्रमबद्ध करूँ तो उन्हें सदस्य के रूप में
दिखाऊं

0

यदि ये कॉन्स्टेंट सेवा के संदर्भ या स्विच हैं जो कि अनुप्रयोग व्यवहार को प्रभावित करते हैं तो मैं उन्हें अनुप्रयोग उपयोगकर्ता सेटिंग्स के रूप में स्थापित करूंगा। इस तरह अगर उन्हें बदलने की जरूरत है, तो आपको फिर से इकट्ठा करने की ज़रूरत नहीं है और आप अभी भी उन्हें स्थैतिक गुण वर्ग के माध्यम से संदर्भित कर सकते हैं।

Properties.Settings.Default.ServiceRef

0

मैं स्टैटिक क्लास को स्टैटिकली आसानी से सुझाऊंगा। कृपया नीचे कोड स्निपेट ढूंढें:

  public static class CachedKeysManager
    {
        public static readonly string DistributorList = "distributorList";
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.