क्या निरंतर का उपयोग करने के लिए यह एक सही स्थिति है?


42

इसलिए मेरा प्रोफेसर मेरे द्वारा काम कर रहे एक प्रोजेक्ट पर कुछ प्रतिक्रिया दे रहा था। उन्होंने इस कोड के लिए कुछ निशान दिए:

if (comboVendor.SelectedIndex == 0) {
  createVendor cv = new createVendor();
  cv.ShowDialog();
  loadVendors();
}

यह कॉम्बोक्स "इंडेक्स चेंजेड" हैंडलर में है। इसका उपयोग तब किया जाता है जब उपयोगकर्ता एक नया विक्रेता बनाना चाहता है, मेरा शीर्ष विकल्प (सूचकांक 0, जो कभी नहीं बदलता है) "नया विक्रेता बनाएँ" संवाद खोलता है। तो मेरे कॉम्बो बॉक्स की सामग्री इस तरह दिखती है:

Create New Vendor...
Existing Vendor
Existing Vendor 2
Existing Vendor 3

उनकी समस्या पहली पंक्ति कोड के साथ है:

if (comboVendor.SelectedIndex == 0)

उनका दावा है कि 0 एक स्थिर होना चाहिए, और वास्तव में मुझे इस वजह से चिह्नित करना चाहिए। उनका दावा है कि मुझे अपने कोड में शाब्दिक का उपयोग नहीं करना चाहिए।

बात यह है, मुझे समझ में नहीं आता है कि मैं उस स्थिति को एक निरंतर क्यों बनाना चाहता हूं। यह सूचकांक कभी नहीं बदलेगा, न ही यह कुछ ऐसा है जिसे आपको ट्विक करने की आवश्यकता होगी। यह स्मृति की बर्बादी की तरह लगता है स्मृति में एक भी 0 रखने के लिए जो एक बहुत विशिष्ट स्थिति के लिए उपयोग किया जाता है और कभी नहीं बदलता है।


32
वह हठधर्मी हो रहा है। जादू की संख्या सामान्य रूप से बचने के लिए एक अच्छी बात है। मुझे लगता है कि -1, 0 और 1 को उस नियम के अपवाद माना जा सकता है। इसके अलावा, इस तरह एक निरंतर शाब्दिक की तुलना में कोई अधिक कमरा नहीं ले जाएगा 0.
डेव मूनी

23
@DaveMooney: क्या आप सुनिश्चित हैं कि आप यहाँ घुटने-झटका प्रतिक्रिया नहीं कर रहे हैं? यह सच है कि जैसी चीजों -1में str.indexOf(substr) != -1"के लिए strहोता है substr" prefectly उचित है। लेकिन यहां, 0 का अर्थ न तो स्पष्ट है (एक नया विक्रेता बनाने के संबंध क्या है?) और न ही वास्तव में स्थिर (यदि एक नया विक्रेता बनाने का तरीका बदलता है?)।

62
नियम तोड़ने से पहले आपको नियमों को सीखना होगा
रयथल

12
मेरे पास अप्रत्याशित रूप से यह तरीका विफल था। सूची को वर्णानुक्रम में क्रमबद्ध किया गया था। मैंने इस्तेमाल किया - - नया बनाएँ - - तो डैश पहले और हार्ड कोडित इंडेक्स को क्रिएट करने के लिए क्रिएट करेगा। तब किसी ने एक आइटम 'माई आइटम' के साथ शुरू किया, जो डैश से पहले सॉर्ट करता है। अगली बार सूची लोड होने के कारण मेरी हार्ड कोडिंग के कारण कार्यक्रम क्रैश हो गया। मुझे ग्राहक के डेटा को पुनर्प्राप्त करने के लिए सूची की डेटा फ़ाइल को मैन्युअल रूप से संशोधित करना पड़ा।
हाथ-ई-खाद्य

14
आप int.Zeroउसे खुश करने के बजाय उपयोग कर सकते हैं :)
पॉल स्टोवेल

जवाबों:


90

सी # में ऐसा करने का वास्तविक सही तरीका कॉम्बोइमेट्स के आदेश पर बिल्कुल भी भरोसा नहीं करना है

public partial class MyForm : Form
{
    private readonly object VENDOR_NEW = new object();

    public MyForm()
    {
        InitializeComponents();
        comboVendor.Items.Insert(0, VENDOR_NEW);
    }

    private void comboVendor_Format(object sender, ListControlConvertEventArgs e)
    {
        e.Value = (e.ListItem == VENDOR_NEW ? "Create New Vendor" : e.ListItem);
    }

    private void comboVendor_SelectedIndexChanged(object sender, EventArgs e)
    {
        if(comboVendor.SelectedItem == VENDOR_NEW)
        {
            //Special logic for selecting "create new vendor"
        }
        else
        {
            //Usual logic
        }
    }
}

22
ठीक है, अगर यह C # है, तो आपको स्थिरांक के लिए ALL_CAPS का उपयोग नहीं करना चाहिए। स्थिरांक पास्केलडेड होना चाहिए - stackoverflow.com/questions/242534/…
Groky

4
@Groky: यह मामला क्यों है? कौन परवाह करता है कि वह अपने स्थिरांक का नाम कैसे देता है? यदि वह निरंतर रूप से ALL_CAPS का उपयोग करता है तो यह 100% सही है।
बजे मार्को-फिसेट

4
@marcof: ठीक है, यदि स्थिरांक एक सार्वजनिक इंटरफ़ेस का हिस्सा हैं, तो उसे एमएस नामकरण दिशानिर्देशों का पालन करना चाहिए। यदि नहीं, तो उसे कम से कम प्रारंभिक अभ्यास सीखना चाहिए।
Groky

2
यह अभी भी गलत है। यह पूर्णांक शाब्दिक (शून्य) से एक स्ट्रिंग शाब्दिक (नया विक्रेता बनाएँ) होने में समस्या को स्थानांतरित करता है। सबसे अच्छी समस्या यह है कि 'क्या होगा अगर लेबल बदलता है' के बजाय 'क्या होगा अगर सूचकांक बदलता है'।
Freiheit

7
@Freiheit: गलत। यहाँ स्ट्रिंग स्थिर केवल प्रदर्शन के लिए है; यह कार्यक्रम के तर्क को प्रभावित नहीं करता है। प्रोग्राम-स्टेट को स्टोर करने के लिए जादू-मूल्यों / स्ट्रिंग्स का उपयोग करने के विपरीत, इस स्ट्रिंग को बदलना (या सूची से चीजों को जोड़ना / जोड़ना) कभी भी कुछ भी नहीं तोड़ सकता है।
BlueRaja - डैनी Pflughoeft

83

कॉम्बो बॉक्स में क्रम बदल सकता है। क्या होगा अगर आप अपने "न्यू वेंडर बनाएँ ..." से पहले "क्रिएट स्पेशल वेंडर ..." जैसा एक और विकल्प जोड़ दें।

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

एक निरंतर का उपयोग करना भी शाब्दिक की तुलना में अधिक पठनीय है।

if (comboVendor.SelectedIndex == NewVendorIndex)

अधिकांश संकलित भाषाएं संकलन समय पर स्थिरांक का स्थान ले लेंगी, इसलिए कोई प्रदर्शन दंड नहीं है।


5
मैं मूल्य विशेषता में एक वर्णनात्मक कोड का उपयोग कर सकता हूं, बजाय एक सूचकांक पर भरोसा करने के जो बदल सकता है (सूची के निचले भाग में बनाएं विकल्प को स्थानांतरित करके, निरंतर विधि को पूरी तरह से तोड़ देगा)। फिर बस उस कोड की तलाश करें।
कैफीक्यू

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

3
@ समाधान क्योंकि वह सम्मेलन है।
इक्के

3
@ इक्के कि निश्चित रूप से सम्मेलन नहीं है। stackoverflow.com/questions/242534/...
SolutionYogi

1
अगर हम C # के बारे में बात कर रहे हैं तो NewVendorIndex, कन्वेंशन है। यह बाकी .NET स्टाइल के अनुरूप है।
MaR

36

आपके द्वारा वर्णित यह स्थिति एक निर्णय कॉल है, व्यक्तिगत रूप से मैं एक का उपयोग नहीं करूंगा यदि इसका केवल एक बार उपयोग किया जाता है और पहले से ही पठनीय है।

हालांकि असली जवाब यह है कि उसने आपको सबक सिखाने के लिए यह कदम उठाया।

मत भूलो कि वह एक प्रोफेसर है, उसका काम आपको कोडिंग और सर्वोत्तम अभ्यास सिखाना है।

मैं कहूंगा कि वह वास्तव में बहुत अच्छा काम कर रहा है।

यकीन है कि वह थोड़ा निरपेक्ष आ सकता है, लेकिन मुझे यकीन है कि आप जादू की संख्या का उपयोग करने से पहले फिर से सोचेंगे।

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

आपके प्रोफेसर को सलाम।


यह इंगित करने के लिए +1, इस मामले में, साधन अंतिम परिणाम को सही ठहराते हैं
जैतून-क्लेयर

@ थानोस- "यह मत भूलो कि वह एक प्रोफेसर हैं, उनका काम आपको कोडिंग और सर्वोत्तम अभ्यास सिखाना है। " मेरे प्रोफेसर के लिए ऐसा कभी नहीं हुआ था। मैं कहूंगा कि उसका काम आपको यह सिखाना है कि कोर्स बनने के बाद विभाग को क्या लगता है।
रामहुंड 18

13

[...] मेरा शीर्ष विकल्प (इंडेक्स 0, जो कभी नहीं बदलता है) "नया विक्रेता बनाएँ" संवाद खोलता है।

यह तथ्य कि आपको यह समझाना था कि साबित होता है कि आपको एक निरंतर उपयोग क्यों करना चाहिए। यदि आपने एक स्थिरांक की तरह परिचय दिया है NEW_VENDOR_DIALOG, तो आपका कोड अधिक आत्म-व्याख्यात्मक होगा। इसके अलावा, कंपाइलर स्थिरांक का अनुकूलन करते हैं, इसलिए प्रदर्शन में बदलाव नहीं होगा।

प्रोग्रामर के लिए प्रोग्राम लिखें, कंपाइलर नहीं। जब तक आप विशेष रूप से माइक्रो-ऑप्टिमाइज़ करने की कोशिश नहीं कर रहे हैं, जो ऐसा नहीं लगता कि आप जैसे हैं।


2
-1 भी प्रदर्शन का उल्लेख करने के लिए। भले ही एक कंप्यूटर अनुकूलित न हो, उपयोगकर्ता नोटिस से पहले इस तरह के अरबों ऑपरेशन कर सकता है।
बोरिस यांकोव

3
@ बोरिस ओपी संसाधनों की बर्बादी के बारे में चिंतित था, यही वजह है कि मैंने इसका उल्लेख किया। मैं यह नहीं देखता कि उसके कारण मेरा उत्तर कम सही कैसे होगा।
kba

12

उनका दावा है कि 0 एक स्थिर होना चाहिए, और वास्तव में मुझे इस वजह से चिह्नित करना चाहिए।

मैं सहमत हूँ। यहाँ शून्य का उपयोग "जादू" है। कल्पना कीजिए कि आप पहली बार इस कोड को पढ़ रहे हैं। आपको नहीं पता कि शून्य विशेष क्यों है, और शाब्दिक आपको शून्य विशेष क्यों है के बारे में कुछ नहीं बताता है। यदि इसके बजाय आपने कहा if(comboVendor.SelectedIndex == CreateNewVendorIndex)तो यह पहली बार पढ़ने वाले के लिए बहुत स्पष्ट हो जाता है कि कोड का क्या मतलब है।

उनका दावा है कि मुझे अपने कोड में शाब्दिक का उपयोग नहीं करना चाहिए।

यह एक चरम स्थिति है; एक यथार्थवादी स्थिति यह होगी कि शाब्दिक का उपयोग एक लाल झंडा है जो इंगित करता है कि कोड उतना स्पष्ट नहीं हो सकता जितना कि यह हो सकता है। कभी-कभी यह उचित है।

बात यह है, मुझे समझ में नहीं आता है कि मैं उस स्थिति को एक निरंतर क्यों बनाना चाहता हूं। वह सूचकांक कभी नहीं बदलेगा

यह कभी नहीं बदलेगा यह एक निरंतर बनाने के लिए एक उत्कृष्ट कारण है । इसलिए स्थिरांक को स्थिरांक कहा जाता है; क्योंकि वे कभी नहीं बदलते हैं।

न ही यह ऐसा कुछ है जिसे आपको ट्विक करने की आवश्यकता होगी।

वास्तव में? आप किसी भी स्थिति को नहीं देख सकते हैं जिसमें कोई व्यक्ति कॉम्बो बॉक्स में चीजों के क्रम को बदलना चाहे?

तथ्य यह है कि आप एक कारण देख सकते हैं कि भविष्य में यह क्यों बदल सकता है यह एक निरंतर कारण नहीं है। बल्कि यह एक गैर-स्थिर पठनीय स्थिर पूर्णांक फ़ील्ड होना चाहिए। एक स्थिर मात्रा होनी चाहिए जो सभी समय के लिए समान रहने की गारंटी हो । पाई और सोने की परमाणु संख्या अच्छे स्थिरांक हैं। संस्करण संख्याएं नहीं हैं; वे हर संस्करण को बदलते हैं। सोने की कीमत जाहिर है एक भयानक स्थिर है; यह हर सेकंड बदलता है। केवल निरंतर चीजें बनाएं जो कभी नहीं बदलते हैं

यह स्मृति की बर्बादी की तरह लगता है स्मृति में एक भी 0 रखने के लिए जो एक बहुत विशिष्ट स्थिति के लिए उपयोग किया जाता है और कभी नहीं बदलता है।

अब हम इस मामले पर आते हैं।

यह आपके प्रश्न में शायद सबसे महत्वपूर्ण पंक्ति है क्योंकि यह इंगित करता है कि आपको (1) मेमोरी, और (2) अनुकूलन की कुछ गहरी त्रुटिपूर्ण समझ है। आप सीखने के लिए स्कूल में हैं, और अब बुनियादी बातों की सही समझ पाने के लिए एक अच्छा समय होगा। क्या आप विस्तार से बता सकते हैं कि आप क्यों मानते हैं कि "स्मृति में एक शून्य को रखना स्मृति की बर्बादी है"? सबसे पहले, आप यह क्यों मानते हैं कि उपयोगकर्ता द्वारा पता लगाने योग्य भंडारण के कम से कम दो बिलियन बाइट्स के साथ एक प्रक्रिया में चार बाइट्स के उपयोग का अनुकूलन प्रासंगिक है? दूसरा, ठीक है कि आप किस संसाधन की कल्पना करते हैं ? "स्मृति" के सेवन से क्या मतलब है?

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


6

वह सही है। आप सही हे। तुम गलत हो।

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

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

आप गलत हैं, हालांकि, एक स्थिरांक को एक चर के रूप में चारों ओर ले जाया जाता है, 'स्मृति का उपयोग करना'। मानव और संकलक के लिए एक स्थिरांक होता है। यह संकलक को उस मूल्य को संकलन के दौरान उस स्थान पर रखने के लिए कहता है, जहां आपने अन्यथा एक शाब्दिक संख्या डाल दी है। और यहां तक ​​कि अगर यह स्मृति में स्थिर था, लेकिन सभी के लिए सबसे अधिक मांग वाले अनुप्रयोगों में दक्षता का नुकसान भी औसत दर्जे का हो सकता है। किसी एक पूर्णांक की स्मृति उपयोग के बारे में चिंता निश्चित रूप से 'समय से पहले अनुकूलन' में आती है।


1
मैंने इस उत्तर को लगभग वोट कर दिया होता, अगर तीसरे पैराग्राफ के लिए नहीं होता, तो यह दावा करना कि शाब्दिक 0 का उपयोग करना पर्याप्त स्पष्ट है और कोई निरंतर वारंट नहीं है। ज्यादा बेहतर उपाय यह होगा कि आप कॉम्बो बॉक्स आइटम की अनुक्रमणिका पर निर्भर न रहें, बल्कि इसके बजाय चयनित वस्तु के मूल्य पर निर्भर रहें । मैजिक कॉन्स्टेंट मैजिक कांस्टेंट हैं भले ही वे 0 या 3.14 या व्हाट्सएप हों - उन्हें उचित नाम दें क्योंकि यह कोड को अधिक पठनीय बनाता है।
रोलैंड Tepp

सूची में मूल्य का उपयोग करना बेहतर हो सकता है, लेकिन यह सवाल उनके बारे में नहीं था। उनका प्रश्न इस बारे में था कि क्या एक निरंतर के लिए एक उपयुक्त उपयोग था। और अगर कोई GUI के साथ इंटरफेस करने के संदर्भ में 0 की तुलना कर रहा है (जो भी कारण के लिए - शायद किसी को मूल्य की परवाह किए बिना मुट्ठी की वस्तु की तलाश है), मुझे लगता है कि उस स्थान में एक निरंतर का उपयोग करना अनावश्यक होगा।
ग्रैंडमास्टरबी

मैं सहमत नहीं होऊंगा ... सिर्फ कोड को देखकर, यह तुरंत स्पष्ट नहीं है कि 0 का महत्व क्या है - यह वास्तव में हो सकता है कि वह हमेशा सूची में पहले आइटम की तलाश में है और वह यह है, लेकिन फिर इसकी तुलना में अगर 'comboVendor.SelectedIndex == FirstIndex' होगा, तो बहुत क्लीनर पढ़ेगा?
रोलैंड टीपीपी

2

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


1

वह आपके प्रोफेसर की कुल पसंद है। आमतौर पर, आप केवल एक निरंतर का उपयोग करते हैं यदि शाब्दिक कई बार उपयोग किया जाएगा, तो आप पाठक को यह स्पष्ट करना चाहते हैं कि लाइन का उद्देश्य क्या है, या आपका शाब्दिक संभवतः भविष्य में बदल जाएगा, और आप केवल बदलना चाहते हैं एक जगह पर। हालाँकि, इस सेमेस्टर के लिए, प्रोफेसर बॉस हैं, इसलिए मैं इसे उस कक्षा में अभी से करूँगा।

कॉर्पोरेट दुनिया के लिए अच्छा प्रशिक्षण? काफी संभवतः।


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

1

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

.NET कॉम्बोक्स के लिए एक अधिक सामान्य अभ्यास "सेलेक्ट .." आइटम को एक खाली मान देना है, जबकि वास्तविक वस्तुओं में सार्थक मूल्य होते हैं, और फिर करते हैं:

if (string.IsNullOrEmpty(comboVendor.SelectedValue))

बजाय

if (comboVendor.SelectedIndex == 0)

3
आपके उदाहरण में, नल बस एक और शाब्दिक है। इस पाठ का दिल यह है कि शाब्दिक रूप से बचा जाना चाहिए।
overslacked

@ प्रेमी - मेरे उदाहरण में कोई अशक्त शाब्दिक नहीं है।
कार्सन 63000

यहां तक ​​कि अगर एक शून्य शाब्दिक था, तो नल उपयोग करने के लिए एक स्वीकार्य शाब्दिक है, मुझे विश्वास नहीं है कि यह जांचने का एक तरीका है कि क्या किसी वस्तु का संदर्भ बिना जांच के उपयोग के बिना अशक्त है या नहीं, तो यह शून्य के बराबर है।
रामहुंड

Carson63000 - मैं IsNullOrEmpty के आपके उपयोग की बात कर रहा था। आप दूसरे के लिए एक "मैजिक वैल्यू" स्वैप कर रहे हैं। @ रामहुड - कुछ मामलों में नल एक स्वीकार्य शाब्दिक है, कोई सवाल नहीं, लेकिन मेरा मानना ​​है कि यह एक अच्छा उदाहरण है (जादू के मूल्य के रूप में अशक्त या रिक्त का उपयोग करके)।
ओवर

-1 के लिए "एक छोटा सा तोता"। जब आप सही हैं कि मूल्य का उपयोग करना अधिक पारंपरिक और समझने में आसान होगा, अगर चयनित बिंदु का उपयोग करके, नामित नाम का उपयोग निश्चित रूप से सिर्फ 0. से बेहतर है
jmoreno

1

वह स्थिरांक का उपयोग करने के मूल्य पर जोर देने के लिए गलत नहीं है और आप शाब्दिक उपयोग करने में गलत नहीं हैं। जब तक उन्होंने जोर देकर कहा कि यह अपेक्षित कोडिंग शैली है, तब तक आपको शाब्दिक उपयोग करने के लिए अंक नहीं खोना चाहिए क्योंकि वे हानिकारक नहीं हैं। मैंने व्यावसायिक कोड में कई बार शाब्दिक जगह का उपयोग किया है।

उसकी बात हालांकि अच्छी है। यह आपको स्थिरांक के लाभों से अवगत कराने का तरीका हो सकता है:

1-वे आपके कोड को कुछ हद तक आकस्मिक छेड़छाड़ से बचाते हैं

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

3-स्थिरांक प्रकार संरक्षित करते हैं, इसलिए आपको शून्य का मतलब करने के लिए 0F जैसी किसी चीज़ का उपयोग करने की आवश्यकता नहीं है।

4-पढ़ने में आसानी के लिए, COBOL शून्य के लिए आरक्षित शब्द के रूप में शून्य का उपयोग करता है (लेकिन आपको शाब्दिक शून्य का उपयोग करने की अनुमति भी देता है) - इसलिए, एक मूल्य देना कभी-कभी मददगार होता है, उदाहरण के लिए: (स्रोत: ms-Constants

class CalendarCalc
{
    const int months = 12;
    const int weeks = 52; //This is not the best way to initialize weeks see comment
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

या आपके मामले में (जैसा कि @Michael Krussel उत्तर में दिखाया गया है)


2
क्या यह प्रति सप्ताह दिनों के लिए एक अजीब परिभाषा नहीं है? सप्ताह में 7 दिन हैं 7.4287143 नहीं
विंस्टन एवर्ट

@InstonEwert, आपकी टिप्पणी के लिए धन्यवाद। 365/52 = 7.01923076923077 = 7 + (1/52)। अब, यदि आप भिन्नात्मक भाग को हटाते हैं और 7 * 52 की गणना करते हैं, तो आपको 364 दिन मिलते हैं, जो एक वर्ष में दिनों की सही संख्या नहीं है। एक अंश होने से इसे खोने से अधिक सटीक है (चूंकि आप परिणाम दिखाने के लिए प्रारूप 7 कर सकते हैं यदि आप केवल संख्या प्रदर्शित करना चाहते हैं)। वैसे भी, यह स्थिरांक के बारे में एमएस से सिर्फ एक उदाहरण था, लेकिन आपकी बात दिलचस्प है।
NoChance

1
बेशक इसका सिर्फ एक उदाहरण है, लेकिन मुझे आपके कथन पर आपत्ति है कि यह अंश को शामिल करने के लिए अधिक सटीक है। एक सप्ताह को 7 दिनों के रूप में परिभाषित किया गया है। आपकी परिभाषा को देखते हुए 26 सप्ताह 182.5 दिन हैं जो कि सटीक नहीं है। वास्तव में, समस्या आपकी है int weeks = 52, प्रति वर्ष 52 सप्ताह नहीं हैं। एक वर्ष में 52.142857142857146 सप्ताह होते हैं, और उस संख्या को कहते हैं जिसे आपको भिन्नों पर रखना चाहिए। बेशक, केवल एक चीज जो वास्तव में स्थिरांक के पूरे सेट में स्थिर है वह है महीनों की संख्या।
विंस्टन इर्वर्ट

0

यदि आपको इसकी जटिल व्युत्पत्ति है, या यदि इसे अक्सर दोहराया जाता है, तो आपको इसे केवल एक स्थिरांक में रखना होगा। एल्स, एक शाब्दिक ठीक है। सब कुछ एक स्थिर में रखना कुल ओवरकिल है।


केवल अगर आप दो बार अक्सर विचार करते हैं और आपको कोड को संशोधित करने की आवश्यकता नहीं है। दो मामलों में से एक को बदलकर बग बनाना बहुत आसान है।
बिलथोर

0

वास्तव में, जैसा कि उल्लेख किया गया है, अगर स्थिति में बदलाव होता है तो क्या होगा? इंडेक्स पर भरोसा करने के बजाय आप एक कोड का उपयोग / क्या कर सकते हैं।

इसलिए, जब आप अपनी चुनिंदा सूची बनाते हैं तो यह html जैसे समाप्त हो जाता है

<select>
    <option value='CREATE'>Create New Vendor...</option>
    <option value='1'>Existing Vendor</option>
    <option value='2'>Existing Vendor 2</option>
    <option value='3'>Existing Vendor 3</option>
</select>

फिर जांच करने के बजाय selectedIndex === 0, जांच लें कि वह मान क्या है CREATECODEजो एक स्थिरांक में होगा और इस परीक्षण के लिए उपयोग किया जाएगा, और चयन सूची बनाते समय।


3
संभवतः एक अच्छा तरीका है, लेकिन यह देखते हुए कि वह C # का उपयोग कर रहा है, html सबसे अधिक उम्मीद का उदाहरण कोड नहीं है।
विंस्टन इर्वर्ट

0

मुझे इससे पूरी तरह छुटकारा मिल जाएगा। बस कॉम्बो बॉक्स सूची के बगल में एक नया बटन बनाएं। सूची को संपादित करने या बटन पर क्लिक करने के लिए किसी आइटम पर डबल क्लिक करें। कॉम्बोक्स में दफन नई कार्यक्षमता नहीं है। फिर जादू की संख्या पूरी तरह से हटा दी जाती है।

सामान्य तौर पर कोड में किसी भी शाब्दिक संख्या को एक स्थिरांक के रूप में परिभाषित किया जाना चाहिए ताकि संख्या के आसपास संदर्भ रखा जा सके। शून्य का मतलब क्या है? इस मामले में 0 = NEW_VENDOR। अन्य मामलों में, इसका मतलब कुछ अलग हो सकता है, इसलिए यह हमेशा कुछ संदर्भ रखने के लिए पठनीयता और स्थिरता के लिए एक अच्छा विचार है।


0

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

कारण मैं लिख रहा हूँ "स्मृति के उपयोग" पर अपनी टिप्पणी को संबोधित करने के लिए। सी # में, जैसा कि अधिकांश भाषाओं में, कॉन्सेंट कंपाइलर द्वारा "फोल्ड" किया जाता है। उदाहरण के लिए, निम्नलिखित प्रोग्राम को संकलित करें और IL की जांच करें। आप पाएंगे कि उन सभी नंबरों को भी आईएल में नहीं बनाया जा सकता है, अकेले कंप्यूटर की मेमोरी दें:

public class Program
{
    public static int Main()
    {
        const int a = 1000;
        const int b = a + a;
        const int c = b + 42;
        const int d = 7928345;
        return (a + b + c + d) / (-a - b - c - d);
    }
}

परिणामी IL:

.method public hidebysig static 
    int32 Main () cil managed 
{
    .maxstack 1
    .locals init (
        [0] int32 CS$1$0000
    )

    IL_0000: nop
    IL_0001: ldc.i4.m1  // the constant value -1 to be returned.
    IL_0002: stloc.0
    IL_0003: br.s IL_0005

    IL_0005: ldloc.0
    IL_0006: ret
}

तो क्या आप निरंतर अंकगणित का उपयोग करते हुए एक निरंतर, एक शाब्दिक, या एक किलोबाइट कोड का उपयोग करते हैं, मान को IL में शाब्दिक रूप से व्यवहार किया जाता है।

एक संबंधित बिंदु: लगातार तह स्ट्रिंग शाब्दिक पर लागू होता है। कई लोगों का मानना ​​है कि इस तरह की कॉल बहुत ही बेकार, अयोग्य स्ट्रिंग के कारण होती है:

public class Program
{
    public static int Main()
    {
        const string a = "a";
        const string b = a + a;
        const string c = "C";
        const string d = "Dee";
        return (a + b + c + d).Length;
    }
}

लेकिन आईएल देखें:

IL_0000: nop
IL_0001: ldstr "aaaCDee"
IL_0006: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_000b: stloc.0
IL_000c: br.s IL_000e
IL_000e: ldloc.0
IL_000f: ret

निचला रेखा: निरंतर अभिव्यक्तियों पर ऑपरेटर्स के परिणामस्वरूप निरंतर अभिव्यक्ति होती है, और कंपाइलर सभी गणना करता है; यह रन-टाइम प्रदर्शन को प्रभावित नहीं करता है।

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