[C#] #if DEBUG बनाम सशर्त ("DEBUG")


Answers

खैर, यह ध्यान देने योग्य है कि उनका मतलब बिल्कुल वही नहीं है।

यदि DEBUG प्रतीक परिभाषित नहीं किया गया है, तो पहले मामले में SetPrivateValue स्वयं को नहीं बुलाया जाएगा ... जबकि दूसरे मामले में यह अस्तित्व में रहेगा, लेकिन किसी भी कॉलर जिन्हें DEBUG प्रतीक के बिना संकलित किया गया है, उन कॉलों को छोड़ दिया जाएगा।

यदि कोड और उसके सभी कॉलर एक ही असेंबली में हैं तो यह अंतर कम महत्वपूर्ण है - लेकिन इसका मतलब है कि पहले मामले में आपको कॉलिंग कोड के आसपास #if DEBUG भी होना चाहिए।

व्यक्तिगत रूप से मैं दूसरे दृष्टिकोण की सिफारिश करता हूं - लेकिन आपको उनके सिर में स्पष्ट अंतर रखने की आवश्यकता है।

Question

उपयोग करने के लिए बेहतर कौन सा है, और क्यों, एक बड़ी परियोजना पर:

#if DEBUG
    public void SetPrivateValue(int value)
    { ... }
#endif

या

[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }



आइए मान लीजिए कि आपके कोड में एक #else कथन भी था जो जॉन स्कीट के अंक को संबोधित करते हुए एक नल स्टब फ़ंक्शन को परिभाषित करता था। दोनों के बीच एक दूसरा महत्वपूर्ण अंतर है।

मान लीजिए कि #if DEBUG या Conditional फ़ंक्शन एक डीएलएल में मौजूद है जिसे आपके मुख्य प्रोजेक्ट निष्पादन योग्य द्वारा संदर्भित किया गया है। #if का उपयोग करके, सशर्त का मूल्यांकन पुस्तकालय की संकलन सेटिंग्स के संबंध में किया जाएगा। Conditional विशेषता का उपयोग करके, Conditional का मूल्यांकन आवेदक की संकलन सेटिंग्स के संबंध में किया जाएगा।




पहले उदाहरण के साथ, DEBUG को परिभाषित नहीं किया गया है, तो SetPrivateValue निर्माण में मौजूद नहीं होगा, दूसरे उदाहरण के साथ, SetPrivateValue को कॉल में DEBUG परिभाषित नहीं किया गया है, तो निर्माण में मौजूद नहीं होगा।

पहले उदाहरण के साथ, आपको #if DEBUG साथ SetPrivateValue किसी भी कॉल को SetPrivateValue

दूसरे उदाहरण के साथ, SetPrivateValue कॉल छोड़े जाएंगे, लेकिन ध्यान रखें कि SetPrivateValue स्वयं भी संकलित हो जाएगा। यदि आप लाइब्रेरी बना रहे हैं तो यह उपयोगी है, इसलिए आपकी लाइब्रेरी का संदर्भ देने वाला एक एप्लिकेशन अभी भी आपके फ़ंक्शन का उपयोग कर सकता है (यदि स्थिति पूरी हो जाती है)।

यदि आप कॉल को छोड़ना चाहते हैं और कैली की जगह को सहेजना चाहते हैं, तो आप दो तकनीकों के संयोजन का उपयोग कर सकते हैं:

[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value){
    #if DEBUG
    // method body here
    #endif
}



Links