#ifdef ใน C #


117

ฉันต้องการทำด้านล่าง แต่ใน 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) ได้อย่างไร
Matt

คำตอบ:


163
#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 ในคุณสมบัติบิลด์ของคุณ


52

ฉันอยากจะแนะนำให้คุณใช้Conditional Attribute !

อัปเดต: 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 ("Executed Class1.ConditionalMethod");
       }
    }

สรุป:

ฉันจะใช้#ifdefใน C ++ แต่ด้วย C # / VB ฉันจะใช้แอตทริบิวต์เงื่อนไข วิธีนี้จะซ่อนนิยามวิธีการโดยไม่ต้องซ่อนส่วนของโค้ดที่เรียกมัน รหัสการโทรยังคงถูกคอมไพล์และตรวจสอบความถูกต้องโดยคอมไพลเลอร์วิธีนี้ไม่ได้ถูกเรียกที่รันไทม์ คุณอาจต้องการใช้#ifเพื่อหลีกเลี่ยงการอ้างอิงเนื่องจากมีเงื่อนไขแอตทริบิวต์โค้ดของคุณยังคงคอมไพล์


1
+1 นี่เป็นสิ่งที่ดี แต่มีข้อ จำกัด เช่นเมื่อคุณพยายามส่งคืนค่าจากวิธีเงื่อนไข (ตามที่ฉันเข้าใจ) ฉันคิดว่าตัวอย่างแบบอินไลน์จะช่วยได้
Hamish Grubijan

1
นอกจากนี้ยังไม่ป้องกันการคอมไพล์โค้ด แต่ก็ไม่อนุญาตให้ใช้โค้ดนั้น ความแตกต่างมีความสำคัญเมื่อคุณต้องการลบการอ้างอิงและอื่น ๆ
Lee Louviere

1

C # มีพรีโปรเซสเซอร์ มันทำงานแตกต่างจาก C ++ และ C เล็กน้อย

นี่คือการเชื่อมโยง MSDN - ส่วนบนทั้งหมดสั่ง preprocessor


11
เป็นจุดเล็กน้อย แต่ C # ไม่มีตัวประมวลผลล่วงหน้า # คำสั่งถูกประมวลผลโดยคอมไพเลอร์หลักราวกับว่ามีตัวประมวลผลล่วงหน้า ดูที่นี่: msdn.microsoft.com/en-us/library/ed8yd1ha.aspx ผลลัพธ์หลักของความแตกต่างนี้คือมาโครสไตล์ c / c ++ ไม่ทำงาน
Simon P Stevens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.