#ifdef में C #


116

मैं नीचे करना चाहूंगा लेकिन C ++ के बजाय C # में

#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
c# 

चेक इस उत्कृष्ट जवाब के रूप में अच्छी तरह से, यह कैसे आप प्रोजेक्ट फ़ाइल (.csproj) के माध्यम से परिस्थितियों के आधार पर डिबग प्रतीकों जोड़ सकते हैं दर्शाता है।
मैट

जवाबों:


162
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif

सुनिश्चित करें कि आपके पास अपनी बिल्ड संपत्तियों में जाँच की गई DEBUG को परिभाषित करने के लिए चेकबॉक्स है।


51

मैं आपको सशर्त गुण का उपयोग करने की सलाह दूंगा !

अपडेट: 3.5 साल बाद

आप #ifइस तरह का उपयोग कर सकते हैं ( उदाहरण MSDN से कॉपी किया गया ):

// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !VC_V7)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
        Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
        Console.WriteLine("DEBUG and VC_V7 are defined");
#else
        Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
    }
}

केवल तरीकों के कुछ हिस्सों को छोड़कर उपयोगी है।

यदि तुम प्रयोग करते हो #if किसी विधि को संकलन से बाहर लिए करते हैं तो आपको कोड के सभी टुकड़ों को संकलन से बाहर करना होगा जो उस पद्धति को भी कहते हैं (कभी-कभी आप कुछ कक्षाओं को रनटाइम पर लोड कर सकते हैं और आपको कॉलर को "सभी संदर्भ खोजें" नहीं मिल सकता है)। अन्यथा त्रुटियां होंगी।

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

यहाँ एक उदाहरण है:

    // कॉलिंग Class1.ConditionalMethod () रनटाइम पर ध्यान नहीं दिया जाएगा 
    // जब तक DEBUG स्थिरांक को परिभाषित नहीं किया जाता है


    System.Diagnostics का उपयोग करना;
    वर्ग class1 
    {
       [सशर्त ( "डीबग")]
       सार्वजनिक स्थैतिक शून्य ConditionalMethod () {
          Console.WriteLine ("एक्ज़ीक्यूटेड क्लास 1। कोंडिशनल मैथोड");
       }
    }

सारांश:

मैं #ifdefC ++ में उपयोग करूंगा लेकिन C # / VB के साथ मैं सशर्त विशेषता का उपयोग करूंगा। इस तरह से आप विधि की परिभाषा को छिपाने के लिए कोड के टुकड़ों को छिपाने के लिए बिना इसे कहते हैं। कॉलिंग कोड अभी भी संकलित है और संकलक द्वारा मान्य है, विधि को रनटाइम पर नहीं कहा जाता है। आप #ifनिर्भरता से बचने के लिए उपयोग करना चाह सकते हैं क्योंकि सशर्त विशेषता के साथ आपका कोड अभी भी संकलित है।


1
+1 यह वास्तव में अच्छा है, लेकिन इसकी सीमाएँ हैं, जैसे कि जब आप एक सशर्त विधि से एक मूल्य वापस करने की कोशिश करते हैं (जैसा कि मैं यह समझता हूं)। एक इनलाइन उदाहरण से मुझे मदद मिलेगी।
हमीश ग्रुबीजन

1
यह कोड को संकलित होने से भी नहीं रोकता है, यह बस उस कोड को अनुमति नहीं देता है। जब आप निर्भरता और ऐसे को दूर करना चाहते हैं तो भेद महत्वपूर्ण है।
ली लुईविरे

1

C # में प्रीप्रोसेसर है। यह C ++ और C की तुलना में थोड़ा अलग तरीके से काम करता है।

यहाँ एक MSDN लिंक है - सभी प्रीप्रोसेसर निर्देशों पर अनुभाग ।


11
यह एक मामूली बात है, लेकिन C # में प्रीप्रोसेसर नहीं है। # निर्देशों को मुख्य संकलक द्वारा संसाधित किया जाता है जैसे कि कोई पूर्वप्रक्रमक था। यहाँ देखें: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx इस अंतर का मुख्य परिणाम यह है कि c / c ++ स्टाइल मैक्रोज़ काम नहीं करता है।
सिमोन पी स्टीवंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.