[c#] सी # अगर / तो डीबग बनाम रिलीज के लिए निर्देश



Answers

डिफ़ॉल्ट रूप से, विजुअल स्टूडियो DEBUG को परिभाषित करता है अगर परियोजना डीबग मोड में संकलित की जाती है और इसे रिलीज़ मोड में परिभाषित नहीं करती है। रिलीज मोड में डिफ़ॉल्ट रूप से रिलीज नहीं किया गया है। इस तरह कुछ प्रयोग करें:

#if DEBUG
  // debug stuff goes here
#else
  // release stuff goes here
#endif

अगर आप केवल रिलीज मोड में कुछ करना चाहते हैं:

#if !DEBUG
  // release...
#endif

साथ ही, यह इंगित करने लायक है कि आप उन तरीकों पर [Conditional("DEBUG")] विशेषता का उपयोग कर सकते हैं जो एक निश्चित प्रतीक परिभाषित किए जाने पर उन्हें केवल निष्पादित करने के लिए void लौटाते हैं। यदि प्रतीक परिभाषित नहीं किया गया है तो संकलक उन विधियों को सभी कॉल हटा देगा:

[Conditional("DEBUG")]
void PrintLog() {
    Console.WriteLine("Debug info");
}

void Test() {
    PrintLog();
}
Question

समाधान गुणों में, मेरे पास कॉन्फ़िगरेशन सेट को मेरे एकमात्र प्रोजेक्ट के लिए "रिलीज़" करने के लिए सेट किया गया है।

मुख्य दिनचर्या की शुरुआत में, मेरे पास यह कोड है, और यह "मोड = डीबग" दिखा रहा है। मेरे पास इन दो पंक्तियों को शीर्ष पर भी है:

#define DEBUG 
#define RELEASE

क्या मैं सही चर का परीक्षण कर रहा हूं?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

मेरा लक्ष्य डीबग बनाम रिलीज मोड के आधार पर चर के लिए अलग-अलग डिफ़ॉल्ट सेट करना है।




मैं #if सामान का एक बड़ा प्रशंसक नहीं हूं, खासकर यदि आप इसे अपने कोड बेस के चारों ओर फैलाते हैं क्योंकि इससे आपको समस्याएं मिलेंगी जहां डीबग पास हो जाती है लेकिन यदि आप सावधान नहीं हैं तो रिलीज बिल्ड विफल हो जाती है।

तो यहां मैं जो आया हूं ( सी # में #ifdef द्वारा प्रेरित):

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}



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

public static bool isDebugging() {
    bool debugging = false;

    WellAreWe(ref debugging);

    return debugging;
}

[Conditional("DEBUG")]
private static void WellAreWe(ref bool debugging)
{
    debugging = true;
}



bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='

विधि Debug.Assert सशर्त विशेषता DEBUG । यदि यह परिभाषित नहीं किया गया है, तो कॉल और असाइनमेंट है isDebug = true eliminated :

यदि प्रतीक परिभाषित किया गया है, तो कॉल शामिल है; अन्यथा, कॉल (कॉल के पैरामीटर के मूल्यांकन सहित) छोड़ा जाता है।

यदि DEBUG परिभाषित किया गया है, तो isDebug true सेट true (और isDebug को पास किया गया true , जो उस मामले में कुछ भी नहीं करता है)।




एक टिप जो आपको बहुत समय बचा सकती है - भूलें कि भले ही आप बिल्ड कॉन्फ़िगरेशन के तहत debug चुनते हैं (बनाम2012 / 13 मेनू पर यह BUILD => कॉन्फ़िगरेशन मैनेजर के अंतर्गत है) - यह पर्याप्त नहीं है।

आपको पब्लिश Configuration ध्यान देना होगा, जैसे:




Links