2009-06-10 23 views
105

Tôi muốn làm dưới đây nhưng trong C# thay vì C++#ifdef trong 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 
+0

Kiểm tra ** [câu trả lời tuyệt vời] (http://stackoverflow.com/a/43442076/1016343) ** cũng như vậy, nó cho thấy cách bạn có thể thêm các biểu tượng gỡ lỗi dựa trên các điều kiện thông qua tệp dự án (.csproj) . – Matt

+0

@Matt: Thường thì tôi nghĩ SO nên lưu trữ/giải đáp các câu hỏi cũ. –

Trả lời

42

#if sẽ được người bạn mới của bạn, tôi nghĩ.

Nếu bạn muốn xác định biểu tượng biên dịch tùy chỉnh của riêng mình, bạn có thể làm như vậy trong thuộc tính dự án (trên tab Xây dựng; "Ký hiệu biên dịch có điều kiện").

+0

HeavyD beet bạn một vài giây :) –

+6

+1 để liên kết tới tài liệu. – LukeH

+1

@ acidzombie24: Có, bạn cần phải giống như Lucky Luke ở đây (@Luke; không có ý định chơi chữ ...) –

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

Đảm bảo bạn có hộp kiểm để xác định DEBUG đã được kiểm tra trong thuộc tính bản dựng của mình.

+0

Cảm ơn: D –

41

Tôi khuyên bạn nên sử dụng Conditional Attribute!

Cập nhật: 3,5 năm sau

Bạn có thể sử dụng #if như thế này (example copied from 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 
    } 
} 

Chỉ hữu ích cho các bộ phận của các phương pháp.

Nếu bạn sử dụng #if để loại trừ một số phương thức biên dịch thì bạn sẽ phải loại trừ việc biên dịch tất cả các đoạn mã gọi phương thức đó (đôi khi bạn có thể tải một số lớp trong thời gian chạy và không thể tìm thấy người gọi tất cả các tham chiếu "). Nếu không, sẽ có lỗi.

Nếu bạn sử dụng trình biên dịch có điều kiện, mặt khác, bạn vẫn có thể để lại tất cả các đoạn mã gọi phương thức. Tất cả các thông số sẽ vẫn được xác nhận bởi trình biên dịch. Phương thức này sẽ không được gọi tại thời gian chạy. Tôi nghĩ rằng nó là cách tốt hơn để ẩn phương pháp chỉ một lần và không phải loại bỏ tất cả các mã gọi nó là tốt. Bạn không được phép sử dụng thuộc tính có điều kiện trên các phương thức trả về giá trị - chỉ trên các phương thức void. Nhưng tôi không nghĩ rằng đây là một hạn chế lớn bởi vì nếu bạn sử dụng #if với một phương thức trả về một giá trị, bạn phải ẩn tất cả các đoạn mã gọi nó.

Dưới đây là một ví dụ:

 

    // calling Class1.ConditionalMethod() will be ignored at runtime 
    // unless the DEBUG constant is defined 


    using System.Diagnostics; 
    class Class1 
    { 
     [Conditional("DEBUG")] 
     public static void ConditionalMethod() { 
      Console.WriteLine("Executed Class1.ConditionalMethod"); 
     } 
    } 

Tóm tắt:

Tôi sẽ sử dụng #ifdef trong C++ nhưng với C#/VB Tôi sẽ sử dụng thuộc tính điều kiện. Bằng cách này, bạn ẩn định nghĩa phương thức mà không phải ẩn các phần mã gọi nó. Mã gọi vẫn được biên dịch và xác nhận bởi trình biên dịch, phương thức này không được gọi là lúc chạy. Bạn có thể muốn sử dụng #if để tránh sự phụ thuộc vì với thuộc tính Có điều kiện, mã của bạn vẫn được biên dịch.

+1

+1 Điều này thực sự tốt đẹp, nhưng có những hạn chế, chẳng hạn như khi bạn cố gắng trả về một giá trị từ một phương thức có điều kiện (như tôi hiểu điều này). Một ví dụ nội tuyến sẽ giúp tôi nghĩ. –

+1

Nó cũng không ngăn mã được biên dịch, nó chỉ đơn giản là không cho phép mã đó. Sự khác biệt là quan trọng khi bạn muốn loại bỏ các phụ thuộc và như vậy. –

+1

... và vẫn hữu ích 3 năm sau khi cập nhật của bạn – KornMuffin

1

C# không có bộ xử lý trước. Nó hoạt động hơi khác so với của C++ và C.

Đây là liên kết MSDN - phần trên all preprocessor directives.

+10

Đó là một điểm nhỏ, nhưng C# KHÔNG có bộ xử lý trước. # chỉ thị được xử lý bởi trình biên dịch chính như thể có một bộ tiền xử lý. Xem tại đây: http://msdn.microsoft.com/en-us/library/ed8yd1ha.aspx Kết quả chính của sự khác biệt này là các macro kiểu c/C++ không hoạt động. –

Các vấn đề liên quan