खोज…


वाक्य - विन्यास

  • #define [प्रतीक] // एक संकलक प्रतीक को परिभाषित करता है।
  • #undef [सिंबल] // एक कंपाइलर सिंबल को परिभाषित करता है।
  • #warning [चेतावनी संदेश] // एक संकलक चेतावनी उत्पन्न करता है। #If के साथ उपयोगी।
  • #error [त्रुटि संदेश] // कंपाइलर त्रुटि उत्पन्न करता है। #If के साथ उपयोगी।
  • #line [लाइन नंबर] (फ़ाइल नाम) // कंपाइलर लाइन नंबर (और वैकल्पिक रूप से स्रोत फ़ाइल नाम) को ओवरराइड करता है। T4 टेक्स्ट टेम्प्लेट के साथ उपयोग किया जाता है।
  • #pragma चेतावनी [विकलांग | बहाल] [चेतावनी संख्या] // अक्षम / संकलक चेतावनी चेतावनी।
  • #pragma चेकसम " [फ़ाइलनाम] " " [गाइड] " " [चेकसम] " // एक स्रोत फ़ाइल की सामग्री को मान्य करता है।
  • # भाग [क्षेत्र का नाम] // एक संक्षिप्त कोड क्षेत्र को परिभाषित करता है।
  • #endregion // एक कोड क्षेत्र ब्लॉक समाप्त करता है।
  • #if [स्थिति] // यदि स्थिति सही है तो नीचे दिए गए कोड को निष्पादित करें।
  • #else // एक #if के बाद उपयोग किया जाता है।
  • #elif [स्थिति] // एक #if के बाद उपयोग किया जाता है।
  • #endif // अंत में #if के साथ एक सशर्त ब्लॉक शुरू होता है।

टिप्पणियों

प्रीप्रोसेसर निर्देशकों का उपयोग आम तौर पर स्रोत कार्यक्रमों को बदलने और विभिन्न निष्पादन वातावरणों में संकलित करने में आसान बनाने के लिए किया जाता है। स्रोत फ़ाइल में निर्देश विशिष्ट कार्य करने के लिए प्रीप्रोसेसर को बताते हैं। उदाहरण के लिए, प्रीप्रोसेसर टेक्स्ट में टोकन को बदल सकता है, अन्य फ़ाइलों की सामग्री को स्रोत फ़ाइल में सम्मिलित कर सकता है, या टेक्स्ट के अनुभागों को हटाकर फ़ाइल के भाग के संकलन को दबा सकता है। मैक्रो विस्तार से पहले प्रीप्रोसेसर लाइनों को पहचाना और चलाया जाता है। इसलिए, यदि कोई मैक्रो प्रीप्रोसेसर कमांड की तरह दिखने वाली चीज़ में फैलता है, तो वह कमांड प्रीप्रोसेसर द्वारा पहचाना नहीं जाता है।

प्रीप्रोसेसर स्टेटमेंट स्रोत फ़ाइल स्टेटमेंट्स के समान सेट कैरेक्टर का उपयोग करते हैं, इस अपवाद के साथ कि सीक्वेंस से बच जाते हैं समर्थित नहीं हैं। प्रीप्रोसेसर कथनों में प्रयुक्त वर्ण सेट निष्पादन वर्ण सेट के समान है। प्रीप्रोसेसर नकारात्मक चरित्र मानों को भी पहचानता है।

सशर्त अभिव्यक्तियाँ

सशर्त अभिव्यक्ति ( #if , #elif , आदि) बूलियन ऑपरेटरों के एक सीमित उपसमूह का समर्थन करती है। वो हैं:

  • == और != ये केवल परीक्षण के लिए उपयोग किया जा सकता है कि क्या प्रतीक सत्य है (परिभाषित) या गलत (परिभाषित नहीं)
  • && , || , !
  • ()

उदाहरण के लिए:

#if !DEBUG && (SOME_SYMBOL || SOME_OTHER_SYMBOL) && RELEASE == true
Console.WriteLine("OK!");
#endif

वह कोड संकलित करेगा जो प्रिंट करता है "ठीक है!" कंसोल के लिए यदि DEBUG परिभाषित नहीं है, या तो SOME_SYMBOL या SOME_OTHER_SYMBOL को परिभाषित किया गया है, और RELEASE को परिभाषित किया गया है।

नोट: ये प्रतिस्थापन संकलन समय पर किए गए हैं और इसलिए रन समय पर निरीक्षण के लिए उपलब्ध नहीं हैं। #if उपयोग के माध्यम से समाप्त किया गया कोड कंपाइलर के आउटपुट का हिस्सा नहीं है।

इसे भी देखें: MSDN पर C # प्रीप्रोसेसर निर्देश

सशर्त अभिव्यक्तियाँ

जब निम्नलिखित संकलित किया जाता है, तो यह एक अलग मान लौटाएगा जिसके आधार पर निर्देशों को परिभाषित किया गया है।

// Compile with /d:A or /d:B to see the difference
string SomeFunction() 
{
#if A
    return "A";
#elif B
    return "B";
#else
    return "C";
#endif
}

डिबग बिल्ड के लिए अतिरिक्त जानकारी लॉग करने के लिए आमतौर पर सशर्त अभिव्यक्तियों का उपयोग किया जाता है।

void SomeFunc()
{
    try
    {
        SomeRiskyMethod();
    }
    catch (ArgumentException ex)
    {
        #if DEBUG
        log.Error("SomeFunc", ex);
        #endif

        HandleException(ex);
    }
}

संकलक चेतावनी और त्रुटियाँ उत्पन्न करना

कंपाइलर चेतावनियाँ #warning निर्देश का उपयोग करके उत्पन्न की जा सकती हैं, और इसी तरह #error निर्देश का उपयोग करके त्रुटियों को उत्पन्न किया जा सकता है।

#if SOME_SYMBOL
#error This is a compiler Error.
#elif SOME_OTHER_SYMBOL
#warning This is a compiler Warning.
#endif

परिभाषित करना और प्रतीकों को परिभाषित करना

एक कंपाइलर प्रतीक एक ऐसा कीवर्ड है जिसे संकलन-समय पर परिभाषित किया जाता है जिसे कोड के विशिष्ट वर्गों को सशर्त रूप से निष्पादित करने के लिए जांचा जा सकता है।

कंपाइलर प्रतीक को परिभाषित करने के तीन तरीके हैं। उन्हें कोड के माध्यम से परिभाषित किया जा सकता है:

#define MYSYMBOL

उन्हें प्रोजेक्ट गुण> बिल्ड> सशर्त संकलन प्रतीकों के तहत विज़ुअल स्टूडियो में परिभाषित किया जा सकता है:

वीएस कंपाइलर सिंबल

(ध्यान दें कि DEBUG और TRACE पास अपने स्वयं के चेकबॉक्स हैं और स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है।)

या उन्हें /define:[name] C # संकलक, csc.exe पर स्विच करके संकलन-समय पर परिभाषित किया जा सकता है।

आप #undefine निर्देश का उपयोग करके अनिर्धारित प्रतीकों को भी हटा सकते हैं।

इसका सबसे प्रचलित उदाहरण DEBUG प्रतीक है, जो डिबग मोड (बनाम रिलीज़ मोड) में किसी एप्लिकेशन के संकलित होने पर Visual Studio द्वारा परिभाषित किया जाता है।

public void DoBusinessLogic()
{
    try
    {
        AuthenticateUser();
        LoadAccount();
        ProcessAccount();
        FinalizeTransaction();
    }
    catch (Exception ex)
    {
#if DEBUG
        System.Diagnostics.Trace.WriteLine("Unhandled exception!");
        System.Diagnostics.Trace.WriteLine(ex);
        throw;
#else
        LoggingFramework.LogError(ex);
        DisplayFriendlyErrorMessage();
#endif
    }
}

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

क्षेत्र के ब्लॉक

एक संक्षिप्त कोड क्षेत्र को परिभाषित करने के लिए #region और #endregion का उपयोग करें।

#region Event Handlers

public void Button_Click(object s, EventArgs e)
{
    // ...
}

public void DropDown_SelectedIndexChanged(object s, EventArgs e)
{
    // ...
}

#endregion

ये निर्देश केवल तभी फायदेमंद होते हैं जब एक IDE जो समाप्‍त क्षेत्रों (जैसे Visual Studio ) का समर्थन करता है, कोड को संपादित करने के लिए उपयोग किया जाता है।

अन्य संकलक निर्देश

लाइन

#line चेतावनी और त्रुटियों को आउटपुट करते समय संकलक द्वारा रिपोर्ट की गई लाइन संख्या और फ़ाइल नाम को नियंत्रित करता है।

void Test()
{
    #line 42 "Answer"
    #line filename "SomeFile.cs"
    int life; // compiler warning CS0168 in "SomeFile.cs" at Line 42
    #line default
    // compiler warnings reset to default
}

प्रागमा चेकसम

#pragma checksum डिबगिंग के लिए उत्पन्न प्रोग्राम डेटाबेस (PDB) के लिए एक विशिष्ट चेकसम के विनिर्देशन की अनुमति देता है।

#pragma checksum "MyCode.cs" "{00000000-0000-0000-0000-000000000000}" "{0123456789A}"

सशर्त विशेषता का उपयोग करना

System.Diagnostics नाम स्थान से एक Conditional विशेषता जोड़ना विधि को नियंत्रित करने के लिए एक साफ तरीका है जो आपके बिल्ड में कहलाते हैं और जो नहीं हैं।

#define EXAMPLE_A

using System.Diagnostics;
class Program
{
    static void Main()
    {
        ExampleA(); // This method will be called
        ExampleB(); // This method will not be called
    }

    [Conditional("EXAMPLE_A")]
    static void ExampleA() {...}

    [Conditional("EXAMPLE_B")]
    static void ExampleB() {...}
}

संकलक चेतावनी को अक्षम करना और पुनर्स्थापित करना

आप #pragma warning disable उपयोग से कंपाइलर चेतावनियों को अक्षम कर सकते हैं और #pragma warning disable बहाल करने का उपयोग करके उन्हें #pragma warning restore :

#pragma warning disable CS0168

// Will not generate the "unused variable" compiler warning since it was disabled
var x = 5;

#pragma warning restore CS0168

// Will generate a compiler warning since the warning was just restored
var y = 8;

कोमा से पृथक चेतावनी संख्याओं की अनुमति है:

#pragma warning disable CS0168, CS0219

CS उपसर्ग वैकल्पिक है, और यहां तक कि इंटरमिक्स किया जा सकता है (हालांकि यह एक सर्वोत्तम अभ्यास नहीं है):

#pragma warning disable 0168, 0219, CS0414

परियोजना स्तर पर कस्टम प्रीप्रोसेसर

जब कुछ क्रियाओं को छोड़ना पड़ता है तो परीक्षणों के लिए कहने की आवश्यकता होती है, परियोजना स्तर पर कस्टम सशर्त प्रीप्रोसेसिंग सेट करना सुविधाजनक होता है।

Solution Explorer जाएं -> उस प्रोजेक्ट पर राइट माउस क्लिक करें जिसे आप वैरिएबल में सेट करना चाहते हैं -> Properties -> Build -> सामान्य रूप से फील्ड में Conditional compilation symbols और यहां अपना सशर्त वैरिएबल डालें।

यहाँ छवि विवरण दर्ज करें

कोड उदाहरण जो कुछ कोड को छोड़ देगा:

public void Init()
{
    #if !IGNOREREFRESHDB
    // will skip code here
     db.Initialize();
    #endif
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow