क्या #if RELEASE काम करेगा जैसे #if DEBUG करता है C # में?


277

सभी उदाहरणों में मैंने #if संकलक के निर्देशन को देखा है, वे "DEBUG" का उपयोग करते हैं। क्या मैं "RELEASE" का उपयोग उसी तरह से कोड को बाहर करने के लिए कर सकता हूं जिसे मैं डिबग मोड में संकलित करने के लिए नहीं चलाना चाहता? जिस कोड को मैं इस ब्लॉक के साथ घेरना चाहता हूं, वह ईमेल का एक गुच्छा भेजता है, और मैं गलती से परीक्षण करते समय उन्हें बाहर नहीं भेजना चाहता।


3
#if !DEBUGके रूप में एक ही कार्य करता #if RELEASEहै। वैकल्पिक रूप से, #if DEBUGतो #elseफिर #endifअगर वहाँ मोड में चलाने के लिए अलग-अलग कोड है।
नेट

जवाबों:


275

नहीं, यह नहीं होगा, जब तक आप कुछ काम नहीं करते हैं।

यहाँ महत्वपूर्ण हिस्सा यह है कि वास्तव में DEBUG क्या है, और यह एक प्रकार का निरंतर परिभाषित है जो संकलक के खिलाफ जांच कर सकता है।

यदि आप प्रोजेक्ट गुणों की जाँच करते हैं, तो बिल्ड टैब के तहत, आपको तीन चीज़ें मिलेंगी:

  • एक पाठ बॉक्स "सशर्त संकलन प्रतीकों" लेबल
  • "चेक डिबाइन स्थिर" लेबल वाला एक चेक बॉक्स
  • एक चेक बॉक्स जिसे "TRINE निरंतर स्थिर" कहा जाता है

ऐसा कोई चेकबॉक्स नहीं है, न ही निरंतर / प्रतीक पूर्व-परिभाषित है जिसका नाम RELEASE है।

हालाँकि, आप उस नाम को आसानी से सशर्त संकलन प्रतीकों वाले टेक्स्ट बॉक्स में जोड़ सकते हैं, लेकिन सुनिश्चित करें कि ऐसा करने से पहले आप प्रोजेक्ट कॉन्फ़िगरेशन को रिलीज़-मोड पर सेट कर दें, क्योंकि ये सेटिंग्स कॉन्फ़िगरेशन के अनुसार हैं।

इसलिए मूल रूप से, जब तक आप इसे टेक्स्ट बॉक्स में जोड़ते हैं, तब तक #if RELEASEकिसी भी कॉन्फ़िगरेशन के तहत कोई कोड नहीं होगा।


393

RELEASE परिभाषित नहीं है, लेकिन आप उपयोग कर सकते हैं

#if (!DEBUG)
  ...
#endif

2
यह नहीं है, लेकिन निश्चित रूप से आप इस तरह नहीं ऑपरेटर का उपयोग कर सकते हैं। जब मैंने अपना उत्तर लिखा था, तब ऐसा नहीं सोचा था।
लास वी। कार्लसन 16

4
यह करता है, लेकिन आपके समाधान का उपयोग स्पष्ट और "अधिक सही", IMHO है।
डैनियल शेफ़र

1
खासकर जब से आप सिर्फ RELEASE और DEBUG की तुलना में अधिक कॉन्फ़िगरेशन हो सकते हैं - मेरी कुछ परियोजनाओं के लिए DEBUG, RELEASE, और DEPLOY या DEV (DEBUG), TEST, और PROD (
RASEASE

ऊपर की टिप्पणियों से भ्रमित किसी और के लिए, संयुक्त जवाब आश्चर्यचकित RELEASEकिया गया था।
डैन

41

नहीं।

डिबग कॉन्फ़िगरेशन में एक DEBUGपरिभाषित स्थिरांक (स्वचालित रूप से विजुअल स्टूडियो द्वारा परिभाषित) होता है जबकि रिलीज़ मोड के लिए ऐसा कोई स्थिरांक परिभाषित नहीं है। निर्माण के तहत अपनी परियोजना सेटिंग्स की जाँच करें।

प्रोजेक्ट के तहत [परिभाषित DEBUG स्थिरांक] का चयन -> बिल्ड हर फ़ाइल की शुरुआत में #define DEBUG सहित है।

यदि आप रिलीज़ कॉन्फ़िगरेशन के लिए एक निरंतर स्थिरांक को परिभाषित करना चाहते हैं:

  • परियोजना के गुण -> निर्माण
  • रिलीज मोड का चयन करें
  • में सशर्त संकलन प्रतीकों पाठ बॉक्स में प्रवेश: रिलीज़

1
यह बहुत उपयोगी पाया गया क्योंकि मैंने अब अपनी रिलीज़ कॉन्फ़िगरेशन के लिए एक निरंतरता और मेरे परीक्षण कॉन्फ़िगरेशन के लिए परीक्षण स्थिरांक को परिभाषित किया है। परिभाषित करने के लिए बहुत उपयोगी है केवल रिलीज़ के लिए https#if (RELEASE) [RequireHttps] #endif
tekiegirl

27

मेरे वीएस इंस्टॉल (वीएस 2008) पर #if RELEASEकाम नहीं करता है। हालाँकि आप बस इस्तेमाल कर सकते हैं#if !DEBUG

उदाहरण:

#if !DEBUG
SendTediousEmail()
#endif

10

मैंने पहले कभी नहीं देखा ... लेकिन मैंने देखा है:

#if (DEBUG == FALSE)

तथा

#if (!DEBUG)

कि फिर के लिए काम?


प्रीप्रोसेसर प्रतीकों में C # मान नहीं है; वे सिर्फ "परिभाषित" या "परिभाषित नहीं" हैं। तो केवल !ऑपरेटर ही काम करेगा, जैसा कि आपके दूसरे उदाहरण में है।
जोनाथन रेनहार्ट

1
MSDN के अनुसार, आप सही या गलत परीक्षण के लिए == जैसे ऑपरेटरों का उपयोग कर सकते हैं। msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz


4

"पॉप कैटालिन" को यह सही लगा। बिल्ड के प्रकार के आधार पर परिभाषा को नियंत्रित करना लचीलेपन का एक बड़ा सौदा प्रदान करता है। उदाहरण के लिए, आपके पास "DEBUG", "DEMO" और "RELEASE" कॉन्फ़िगरेशन सभी एक ही समाधान में हो सकते हैं। यह दो अलग-अलग समाधानों के साथ डुप्लिकेट प्रोग्रामिंग की आवश्यकता को रोकता है।

तो हाँ #if RELEASEया #if (RELEASE)उसी तरह काम करता है #if DEBUGजब RELEASE संघनित्र प्रतीक को परिभाषित किया जाता है।

निम्नलिखित "पॉप कैटलिन" पोस्ट से लिया गया है: यदि आप रिलीज कॉन्फ़िगरेशन के लिए एक निरंतर स्थिरांक को परिभाषित करना चाहते हैं: * प्रोजेक्ट गुण -> बिल्ड * सिलेक्ट करें रिलीज़ मोड * सशर्त संकलन प्रतीकों पाठ बॉक्स में दर्ज करें: RELEASE


2

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन यह ध्यान देने योग्य है कि आप DEBUG और RELEASE के बाहर अपने स्वयं के कॉन्फ़िगरेशन बना सकते हैं, जैसे TEST या UAT।

यदि आप प्रोजेक्ट प्रॉपर्टीज के बिल्ड टैब पर हैं तो आप "कंसिस्टेंट कंप्लायंस सिंबल्स" को TEST (उदाहरण के लिए) पर सेट करें, इसके बाद आप एक कंस्ट्रक्शन का उपयोग कर सकते हैं जैसे कि

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

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


0

आप अपने खुद के सशर्त संकलन-समय के प्रतीक (आप जैसा भी नाम चाहें) बना सकते हैं। प्रोजेक्ट गुण बॉक्स में स्थित "प्रोजेक्ट बिल्ड संवाद" पर जाएं, मेनू विकल्प: प्रोजेक्ट -> [प्रोजेक्टनेम] गुण ...

आप उन्हें "C # कोड फ़ाइल के शीर्ष पर" भी परिभाषित कर सकते हैं। पसंद:

#define RELEASE
// or
#undef RELEASE

आप एक # कथन में प्रतीक का उपयोग कर सकते हैं:

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif

-8

सिर्फ क्यों नहीं

#if RELEASE
#undef DEBUG
#endif

3
रिलीज़ मोड के अंतर्गत Visual Studio द्वारा परिभाषित RELEASE नाम का कोई निरंतर नाम नहीं है।
पॉप कैटालिन 16

1
/d:RELEASEकाम भी करेगा। आप इसे रिलीज़ कॉन्फ़िगरेशन (प्रोजेक्ट गुण टैब बनाएँ) के तहत सशर्त संकलन प्रतीकों में जोड़ सकते हैं।
स्लीवरनिंजा - MSFT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.