2010-10-05 16 views
5

tôi đang làm theo hướng dẫn này:#if/#endif khác với cách nào?

 static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      int i = 1; 
      while (true) 
      { 
#if TEST 
      if (i % 2 == 0) 
       continue; 
#endif 
       i++; 
       Console.WriteLine("The value of i is {0}", i); 
       if (i > 9) 
        break; 
      } 
      Console.WriteLine("The value of i is {0}", i); 

      Application.Run(new Form1()); 
     } 

mục đích của việc sử dụng #if TEST thay vì chỉ if(TEST) là gì ??

+0

Đây là câu hỏi liên quan: http://stackoverflow.com/questions/15744/how-do-you-use-define –

Trả lời

3

Thật hữu ích khi bạn cần hai (hoặc nhiều hơn) phiên bản mã của bạn. Sau đó, thay vì giữ hai dự án bằng cách sử dụng chỉ thị complier như #if TEST bạn viết cả hai phiên bản trong cùng một dự án. Sau đó, từ các thuộc tính của dự án, bạn có thể đặt giá trị cho TEST llike TEST = true và sau đó biên dịch dự án.

#if TEST 
    Console.WriteLine("Hello World!"); 
#else 
    Console.WriteLine("Goodbye World!"); 
#endif 

Nếu THI = true nó giống như bạn chỉ cần viết: Console.WriteLine("Hello World!"); và ngược lại.

16

Vì sử dụng #IF sẽ xác định xem mã có được biên dịch hay không.

Sử dụng if sẽ xác định xem mã có được thực thi hay không.

Dường như có TEST "môi trường" được xác định trong thời gian biên dịch. Vì vậy, nếu môi trường đó tồn tại, thì

if (i % 2 == 0) 
continue; 

sẽ được kiểm tra và thực hiện: Chỉ các số lẻ sẽ được in.

Điều quan trọng cần lưu ý là mã được biên dịch thay đổi tùy thuộc vào sự tồn tại của TEST. Trong "môi trường KHÔNG CÓ TEST",

if (i % 2 == 0) 
continue; 

sẽ không tồn tại khi ứng dụng được thực thi.

mục đích sử dụng #IF TEST thay vì chỉ khi (KIỂM TRA) là gì?

TEST không phải là biến, cũng không phải là hằng số. Nó thậm chí không tồn tại trong thời gian chạy. Đó là một lá cờ được chuyển tới trình biên dịch để nó có thể quyết định biên dịch một số mã (có nghĩa là biên dịch một số mã) (

Có thể sẽ rõ ràng hơn nếu chỉ thị #if có thứ gì khác bên trong. Cho phép sửa đổi đoạn mã của bạn thành:

#if TEST 
      if (i == 5) 
       System.exit(1)//Not a c# programmer; 
#endif 

Trong trường hợp này, dưới sự tồn tại của TEST, chương trình sẽ chỉ lặp lại 5 lần. Trên mỗi lần lặp lại, i sẽ được kiểm tra theo số 5. Đợi tí!!! Nó thậm chí sẽ không biên dịch!

Nếu TEST không được xác định, thì ứng dụng sẽ tiếp tục cho đến khi đạt được điều kiện thoát khác. Không có so sánh nào của i đối với 5 sẽ được thực hiện. Tìm hiểu thêm về chỉ thị here:

# nếu, cùng với #else, #elif, #endif, #define và #undef chỉ thị, cho phép bạn bao gồm hoặc loại trừ mã dựa trên sự tồn tại của một hoặc nhiều biểu tượng hơn. Điều này có thể là hữu ích khi biên dịch mã để gỡ lỗi xây dựng hoặc khi biên dịch cho cấu hình cụ thể.

3

Đây là những hằng số trình biên dịch, ví dụ:

#if DEBUG 
    Debug.WriteLine("This is written in debug mode"); 
#endif 

Nếu hằng số DEBUG được xác định, mã được biên dịch, nếu không thì nó tước ra, bỏ qua bởi trình biên dịch ..đó là một cách để xác định những gì trong một loại xây dựng nhất định, và bị loại bỏ cho một loại khác.

Đó là thường là được sử dụng cho các câu lệnh loại gỡ lỗi bổ sung, nhưng có thể mở rộng đủ để có nhiều ứng dụng, kiểm tra mã trong trường hợp của bạn.

2

Điều đó có nghĩa là nếu bạn đã xác định biến TEST tiền xử lý và nó có giá trị khác không thì mã sẽ được biên dịch vào chương trình kết quả. Bạn có thể xác định bằng cách đặt THI

 
#define TEST 1 

vào chương trình của bạn trước khi báo cáo kết quả # nếu đã mã mà biên soạn trong.

nếu (TEST) sẽ mở rộng sang if (1) nếu bạn đã định nghĩa thử nghiệm như trên.

+0

Không hẳn - đây là C#, không có bộ tiền xử lý và không cho phép bạn để #define các giá trị như thế. Tuy nhiên, bạn có thể xác định các biểu tượng như một phần của các thiết lập biên dịch của bạn, trong trường hợp này '#if TEST' hoạt động như' #ifdef TEST' trong C/C++. –

+1

Hmm ... mà # kinda trông giống như một ++ ở kích thước phông chữ nhỏ như vậy :) –

1

Từ MSDN:

Khi biên dịch C# gặp một chỉ thị # nếu , tiếp theo cuối cùng bởi một chỉ thị #endif , nó sẽ biên dịch mã giữa các chỉ thị chỉ khi biểu tượng cụ thể được xác định. .. câu lệnh #if trong C# là Boolean và chỉ kiểm tra xem biểu tượng đã được xác định hay chưa.

1

Điều bạn đang thấy là ngôn ngữ macro được viết cho trình biên dịch. Nếu trình biên dịch đang hoạt động ở chế độ TEST, nó sẽ bao gồm các dòng

if (i % 2 == 0) 
continue; 

nếu không thì sẽ không.

Các giá trị này thường được xác định trong thuộc tính của dự án của bạn. Chỉ cần nhấp chuột phải vào dự án của bạn và chọn "Properties", sau đó "Compilation" (làm việc từ bộ nhớ, tại đây;))

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