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




debugging release (8)

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

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

#define DEBUG 
#define RELEASE

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

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

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


अपने कोड में #define DEBUG निकालें। उस विशिष्ट निर्माण के लिए बिल्ड कॉन्फ़िगरेशन में प्रीप्रोसेसर सेट करें (DEBUG / _DEBUG पहले ही वीएस में परिभाषित किया जाना चाहिए)।

"मोड = डीबग" प्रिंट करने का कारण आपकी #define और फिर elif छोड़ देता है।

इसके अलावा, जांच करने का सही तरीका यह है:

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

रिलीज की जांच न करें


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

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


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

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

    WellAreWe(ref debugging);

    return debugging;
}

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

डिफ़ॉल्ट रूप से, विजुअल स्टूडियो 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();
}

मैं #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;
    }
}

मैं इसे #defines की तलाश में इस तरह की जांच करना पसंद करता हूं:

if (System.Diagnostics.Debugger.IsAttached)
{
   //...
}
else
{
   //...
}

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


शीर्ष पर अपनी परिभाषा हटा दें

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

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

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

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

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







release