#ifdef trong C #


116

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

Kiểm tra câu trả lời tuyệt vời này , nó cho thấy cách bạn có thể thêm các ký hiệu gỡ lỗi dựa trên các điều kiện thông qua tệp dự án (.csproj).
Matt

Câu trả lời:


162
#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 đã chọn hộp kiểm để xác định GỠ LỖI trong thuộc tính bản dựng của mình.


51

Tôi muốn giới thiệu bạn sử dụng Thuộc tính có điều kiện !

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

Bạn có thể sử dụng #ifnhư thế này ( ví dụ được sao chép từ 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 việc loại trừ các phần của phương pháp.

Nếu bạn sử dụng #ifđể loại trừ một số phương thức khỏi quá trình biên dịch thì bạn sẽ phải loại trừ khỏi 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à bạn không thể tìm thấy trình gọi bằng "Tìm tất cả các tham chiếu"). Nếu không sẽ có sai sót.

Mặt khác, nếu bạn sử dụng biên dịch có điều kiện, 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 tham số sẽ vẫn được xác nhận bởi trình biên dịch. Phương thức sẽ không được gọi trong thời gian chạy . Tôi nghĩ rằng cách tốt hơn là chỉ ẩn phương thức một lần và không phải xóa tất cả mã gọi nó. Bạn không được phép sử dụng thuộc tính đ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 vì nếu bạn sử dụng #ifvớ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ó.

Đây là một ví dụ:

    // gọi Class1.ConditionalMethod () sẽ bị bỏ qua trong thời gian chạy 
    // trừ khi hằng số DEBUG được xác định


    sử dụng System.Diagnostics;
    lớp Class1 
    {
       [Có điều kiện ("GỠ LỖI")]
       public static void ConditionalMethod () {
          Console.WriteLine ("Thực thi Class1.ConditionalMethod");
       }
    }

Tóm lược:

Tôi sẽ sử dụng #ifdeftrong 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 cần phải ẩn các đoạn mã gọi nó. Mã gọi vẫn được biên dịch và xác thực bởi trình biên dịch, mặc dù vậy, phương thức không được gọi trong thời gian chạy. Bạn có thể muốn sử dụng #ifđể tránh phụ thuộc vì với thuộc tính Đ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, 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). Tôi nghĩ rằng một ví dụ nội tuyến sẽ hữu ích.
Hamish Grubijan

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ự phân biệt là quan trọng khi bạn muốn loại bỏ các phụ thuộc và tương tự.
Lee Louviere

1

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

Đây là một liên kết MSDN - phần trên tất cả các chỉ thị tiền xử lý .


11
Đó 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 trình xử lý trước. Xem tại đây: 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.
Simon P Stevens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.