2010-06-16 47 views
5

Làm thế nào để bạn đặt điều kiện "IF DEBUG" trong chương trình aC# để, vào thời gian chạy, nó sẽ bỏ qua một bộ mã nếu bạn đang chạy trong chế độ Gỡ lỗi, nhưng thực thi một khối mã nếu chương trình không đang chạy trong chế độ gỡ lỗi? Một tình huống mà điều này có thể được sử dụng là nếu một dấu thời gian được thực hiện ở đầu của một khối và một dấu thời gian được thực hiện ở cuối. THey sẽ khó có sự khác biệt về thời gian chạy. Tuy nhiên, nếu bạn đang bước qua mã trong chế độ gỡ lỗi, chúng sẽ khác nhau rất nhiều và các điều kiện lỗi trong "nếu khối" có thể được khởi động dẫn đến việc thực hiện không đúng lúc (một số mã).Làm thế nào để bạn đặt một điều kiện "NẾU BỎ" trong một chương trình C#?

Trả lời

15

Bạn chỉ cần đặt mã của bạn trong một khối như thế này:

#IF DEBUG 

//code goes here 

#endif 

Đây không phải là một điều thời gian chạy, đây là một chỉ thị tiền xử lý, có nghĩa là các mã trong khối đó sẽ thậm chí không được biên dịch và sẽ không được bao gồm.

Nếu bạn muốn kiểm tra trong thời gian chạy nếu bạn đang gỡ lỗi, bạn có thể kiểm tra Debugger.IsAttached

+2

+1 cho bit "thời gian chạy" – Earlz

+2

Trên 'Trình gỡ lỗi.IsAttached', tôi tin rằng nó sẽ là đúng nếu bạn đang làm gỡ lỗi từ xa trên một trang web sản xuất. Có, tôi biết bạn thường không muốn làm điều này, nhưng trong một số trường hợp cạnh mà bạn chỉ không thể tìm ra những gì sai nó có thể giúp đỡ. Chỉ cần đảm bảo mã "gỡ lỗi" của bạn sẽ không gây ra sự cố trong môi trường sản xuất nếu bạn sử dụng gỡ lỗi từ xa. –

+0

+1 @Nelson: Gỡ lỗi từ xa (đính kèm trình gỡ lỗi) là cách duy nhất để gỡ lỗi dịch vụ windows. –

5

Sử dụng # nếu lệnh tiền xử lý:

#if debug 
    // run in debug mode 
#else 
    // run if not in debug mode 
#endif 
+0

không hoạt động khi xem OP ... do đó, tại thời điểm chạy ... – KevinDTimm

0
#if DEBUG 
     // something 
#elif 
     // some other thing 
#endif 
+0

không hoạt động, hãy xem OP ... sao cho, tại thời gian chạy ... – KevinDTimm

+0

@KevinDTimm: Ah, đã bỏ lỡ điểm đó. Đừng bận tâm tôi, tôi chỉ đưa ra câu trả lời sai – simendsjo

3

Bạn cũng có thể sử dụng

[Conditional("Debug")] 

thuộc tính trên phương pháp.

+0

không hoạt động khi xem OP ... sao cho, tại thời điểm chạy ... – KevinDTimm

0
#if (DEBUG) 
... 
#else 
... 
#endif 

thấy ở đây: http://bloggingabout.net/blogs/rick/archive/2005/03/10/2396.aspx

+0

không hoạt động, hãy xem OP ... để tại thời điểm chạy ... – KevinDTimm

+0

@KevinDTimm: Mặc dù người hỏi nói "thời gian chạy", tôi không hiểu tại sao kịch bản cụ thể của anh ta không thể bị xử lý bởi chỉ thị tiền xử lý. Có vẻ như anh ta muốn bỏ qua công cụ 'if (ItTookALongTime) 'khi chạy trong chế độ gỡ lỗi, vì trong chế độ gỡ lỗi, chúng ta mong đợi nó có thể mất nhiều thời gian ... vậy tại sao không đảm bảo' if (ItTookALongTime) ' bị loại trừ khi chúng tôi biên dịch để gỡ lỗi? –

+0

bởi vì nó không phải là những gì ông yêu cầu :) ông muốn một cách để bật cờ cho mục đích gỡ lỗi, điều này có thể dễ dàng là một cách (trong tương lai) để bật ghi nhật ký (ví dụ). – KevinDTimm

1

Một vài chi tiết:

  • Bạn có thể bọc toàn bộ một phương pháp hay chỉ là một khối mã hay chỉ là một dòng mã.
  • Bạn cần phải thêm using System.Diagnostics;
+0

câu trả lời duy nhất giải quyết câu hỏi – KevinDTimm

0

Vì mỗi câu trả lời khác (nhưng một) không đề cập đến câu hỏi của bạn, hãy để tôi thử:

Nếu bạn muốn có một công tắc thời gian chạy, bạn sẽ cần một để lấy thông tin từ môi trường của bạn hoặc dòng lệnh. Ngoài ra, một khi bạn nhận được thông tin đó, bạn sẽ cần phải áp dụng nó vào chương trình của bạn.

1) Đối với điều này, bạn sẽ cần một biến toàn cục.

bool bDebug; 

2) có được thông tin gỡ lỗi

bDebug = strcmp (getEnv ("DebuggingMode"), "1"); // you'll need to mess with this a little - do 'man getenv' and 'man strcmp' for an understanding of what I'm doing 
  • hoặc -

sử dụng các getopt() chức năng để tìm hiểu xem gỡ lỗi bị tắt hoặc trên

3) mỗi đặt trong mã của bạn mà bạn muốn gỡ lỗi được bật, kiểm tra xem bDebug có được đặt

if (bDebug) { 
    // do something 
    } 
Các vấn đề liên quan