#if RELEASE จะทำงานเหมือน #if DEBUG ใน C # หรือไม่


277

ในตัวอย่างทั้งหมดที่ฉันเห็นเกี่ยวกับคำสั่งคอมไพเลอร์ # หากใช้คำสั่ง "DEBUG" ฉันสามารถใช้ "RELEASE" ในวิธีเดียวกันกับการแยกรหัสที่ฉันไม่ต้องการให้ทำงานเมื่อคอมไพล์ในโหมดดีบั๊กหรือไม่? รหัสที่ฉันต้องการล้อมรอบด้วยบล็อกนี้จะส่งอีเมลจำนวนมากและฉันไม่ต้องการส่งออกโดยไม่ตั้งใจเมื่อทำการทดสอบ


3
#if !DEBUGทำหน้าที่ฟังก์ชั่นเดียวกับที่#if RELEASEจะได้ หรืออีกทางหนึ่ง#if DEBUGแล้ว#elseแล้ว#endifถ้ามีรหัสที่แตกต่างกันในการทำงานในโหมด
Nat

คำตอบ:


275

ไม่มันจะไม่เว้นแต่คุณจะทำงานบางอย่าง

ส่วนที่สำคัญที่นี่คือสิ่งที่ DEBUG เป็นจริงและเป็นค่าคงที่ที่คอมไพเลอร์สามารถตรวจสอบได้

หากคุณตรวจสอบคุณสมบัติของโครงการภายใต้แท็บสร้างคุณจะพบสามสิ่ง:

  • กล่องข้อความชื่อ "สัญลักษณ์การรวบรวมแบบมีเงื่อนไข"
  • กล่องกาเครื่องหมายที่มีข้อความ "กำหนดค่าคงที่ DEBUG"
  • กล่องกาเครื่องหมายที่ระบุว่า "กำหนดค่าคงที่ TRACE"

ไม่มีช่องทำเครื่องหมายดังกล่าวหรือค่าคงที่ / สัญลักษณ์ที่กำหนดไว้ล่วงหน้าที่มีชื่อ RELEASE

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

โดยพื้นฐานแล้วถ้าคุณไม่เพิ่มเข้าไปในกล่องข้อความ#if RELEASEจะไม่สร้างรหัสใด ๆ ภายใต้การกำหนดค่าใด ๆ


393

RELEASE ไม่ได้ถูกกำหนด แต่คุณสามารถใช้ได้

#if (!DEBUG)
  ...
#endif

2
มันไม่ใช่ แต่คุณสามารถใช้ตัวดำเนินการ NOT แบบนั้นได้ ไม่คิดว่าเมื่อฉันเขียนคำตอบของฉัน
Lasse V. Karlsen

4
มันทำได้ แต่การใช้โซลูชันของคุณนั้นชัดเจนกว่าและ "ถูกต้องกว่า" IMHO
Daniel Schaffer

1
โดยเฉพาะอย่างยิ่งนับตั้งแต่ที่คุณสามารถมีการกำหนดค่าที่มากกว่าเพียงแค่การปล่อยและการแก้ปัญหา - สำหรับบางส่วนของโครงการของฉันมี DEBUG, ปล่อย, และปรับใช้หรือ DEV (ดีบัก), การทดสอบและการแยง (ปล่อย)
อดัม Nofsinger

สำหรับคนอื่นที่สับสนโดยความคิดเห็นข้างต้นคำตอบที่ไม่ได้แก้ไขสงสัยว่าRELEASEถูกกำหนดไว้หรือไม่
ด่าน

41

Nope

ในขณะที่อยู่ในการกำหนดค่าการตรวจแก้จุดบกพร่องมีค่าDEBUGคงที่กำหนดไว้ (กำหนดโดยอัตโนมัติโดย Visual Studio) ในขณะที่ไม่มีค่าคงที่ดังกล่าวกำหนดไว้สำหรับโหมดการเปิดตัว ตรวจสอบการตั้งค่าโครงการภายใต้งานสร้าง

การเลือก [กำหนดค่าคงที่ DEBUG] ภายใต้โครงการ -> บิลด์จะเหมือนกับ #define DEBUG ที่จุดเริ่มต้นของทุกไฟล์

หากคุณต้องการกำหนดค่าคงที่ RELEASE สำหรับการกำหนดค่ารุ่นไปที่:

  • คุณสมบัติโครงการ -> สร้าง
  • เลือกโหมดการวางจำหน่าย
  • ในช่องข้อความสัญลักษณ์การรวบรวมแบบมีเงื่อนไขให้ป้อน: RELEASE

1
พบว่ามีประโยชน์มากเพราะฉันได้กำหนดค่าคงที่ RELEASE สำหรับการกำหนดค่า Release ของฉันและค่าคงที่การทดสอบสำหรับการกำหนดค่าการทดสอบของฉัน มีประโยชน์มากสำหรับการกำหนดต้องการ https สำหรับการเปิดตัวเท่านั้น#if (RELEASE) [RequireHttps] #endif
tekiegirl

27

ในการติดตั้ง VS ของฉัน (VS 2008) #if RELEASEไม่ทำงาน อย่างไรก็ตามคุณสามารถใช้#if !DEBUG

ตัวอย่าง:

#if !DEBUG
SendTediousEmail()
#endif

10

ฉันไม่เคยเห็นมาก่อน ... แต่ฉันเคยเห็น:

#if (DEBUG == FALSE)

และ

#if (!DEBUG)

ใช้งานได้สำหรับยา


สัญลักษณ์ของตัวประมวลผลล่วงหน้าไม่มีค่าใน C #; พวกเขาเป็นเพียง "กำหนด" หรือ "ไม่ได้กำหนด" ดังนั้น!ผู้ประกอบการเท่านั้นที่จะทำงานได้ดังตัวอย่างที่สองของคุณ
Jonathon Reinhart

1
ตาม MSDN คุณสามารถใช้โอเปอเรเตอร์เช่น == เพื่อทดสอบว่าจริงหรือเท็จ msdn.microsoft.com/en-us/library/4y6tbswk.aspx
jason_ruz

8

คุณสามารถใช้#if(!DEBUG)เพื่อวัตถุประสงค์นี้


บันทึกที่ดีสำหรับฉันคือต้องการที่จะใช้มันใน xamrian ขอบคุณสำหรับการโพสต์
rogue39nin

4

"Pop Catalin" เข้าใจถูกต้อง การควบคุมคำจำกัดความตามชนิดของบิลด์ให้ความยืดหยุ่นอย่างมาก ตัวอย่างเช่นคุณสามารถมีการกำหนดค่า "DEBUG", "DEMO" และ "RELEASE" ทั้งหมดในโซลูชันเดียวกัน ซึ่งป้องกันความต้องการการเขียนโปรแกรมซ้ำด้วยโซลูชันที่แตกต่างกันสองแบบ

ดังนั้นใช่#if RELEASEหรือใช้#if (RELEASE)งานได้เหมือนกัน#if DEBUGเมื่อมีการกำหนดสัญลักษณ์การคอมไพล์ RELEASE แบบมีเงื่อนไข

ข้อมูลต่อไปนี้นำมาจากโพสต์ "Pop Catalin": หากคุณต้องการกำหนดค่าคงที่ RELEASE สำหรับการกำหนดค่าการปล่อยให้ไปที่: * คุณสมบัติโครงการ-> สร้าง * เลือกโหมดการเผยแพร่ * ในช่องข้อความสัญลักษณ์การรวบรวมแบบมีเงื่อนไขป้อน: RELEASE


2

ฉันรู้ว่านี่เป็นคำถามเก่า แต่มันอาจคุ้มค่าที่จะกล่าวถึงว่าคุณสามารถสร้างการกำหนดค่าของคุณเองนอก DEBUG และ RELEASE เช่น TEST หรือ UAT

หากในแท็บ "สร้าง" ของหน้าคุณสมบัติโครงการคุณต้องตั้งค่า "สัญลักษณ์การรวบรวมแบบมีเงื่อนไข" เป็นแบบทดสอบ (เช่น) คุณสามารถใช้โครงสร้างเช่น

#if (DEBUG || TEST )
    //Code that will not be executed in RELEASE or UAT
#endif

คุณสามารถใช้โครงสร้างนี้ด้วยเหตุผลเฉพาะเช่นไคลเอนต์ที่แตกต่างกันถ้าคุณมีความต้องการหรือแม้กระทั่งวิธีการเว็บทั้งหมดเช่น เราเคยใช้สิ่งนี้ในอดีตที่บางคำสั่งทำให้เกิดปัญหากับฮาร์ดแวร์เฉพาะดังนั้นเราจึงมีการกำหนดค่าสำหรับแอพเมื่อปรับใช้กับฮาร์ดแวร์ X


0

คุณสามารถสร้างสัญลักษณ์เวลารวบรวมแบบมีเงื่อนไขของคุณ (ชื่อใดก็ได้ที่คุณชอบ) ไปที่ "โครงการสร้างกล่องโต้ตอบ" ตั้งอยู่ในกล่องคุณสมบัติโครงการตัวเลือกเมนู: โครงการ -> [ชื่อโครงการ] คุณสมบัติ ...

นอกจากนี้คุณยังสามารถกำหนด "ที่ด้านบนของไฟล์รหัส C #" ชอบ:

#define RELEASE
// or
#undef RELEASE

คุณสามารถใช้สัญลักษณ์ในคำสั่ง #if:

#if RELEASE
// code ...
#elif 
// code ...
#endif

// or

#if !RELEASE
// code ...
#endif

-8

ทำไมไม่เพียงแค่

#if RELEASE
#undef DEBUG
#endif

3
ไม่มีค่าคงที่ชื่อ RELEASE ที่กำหนดโดย Visual Studio ภายใต้โหมดการปล่อย
Pop Catalin

1
/d:RELEASEก็จะทำงานเช่นกัน คุณสามารถเพิ่มสิ่งนี้กับสัญลักษณ์การคอมไพล์แบบมีเงื่อนไขได้ภายใต้ Release configuration (แท็บการสร้างคุณสมบัติโครงการ)
SliverNinja - MSFT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.