ฉันต้องการทำด้านล่าง แต่ใน 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 # แทนที่จะเป็น 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
คำตอบ:
#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 ในคุณสมบัติบิลด์ของคุณ
ฉันอยากจะแนะนำให้คุณใช้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เพื่อหลีกเลี่ยงการอ้างอิงเนื่องจากมีเงื่อนไขแอตทริบิวต์โค้ดของคุณยังคงคอมไพล์
C # มีพรีโปรเซสเซอร์ มันทำงานแตกต่างจาก C ++ และ C เล็กน้อย
นี่คือการเชื่อมโยง MSDN - ส่วนบนทั้งหมดสั่ง preprocessor