Chỉ thị tiền xử lý (Preprocessor Directive) trong C# cho phép thay đổi mã của dự án tại thời điểm biên dịch, tùy thuộc vào ký hiệu được định nghĩa hay không. Để tìm hiểu chi tiết về chỉ thị tiền xử lý (Preprocessor Directive) trong C# là gì, bạn đọc cùng tham khảo tiếp bài viết dưới đây của Taimienphi.vn.
Chỉ thị tiền xử lý (Preprocessor Directive) trong C#
Chỉ thị tiền xử lý (Preprocessor Directive) là các lệnh đặc biệt được chèn vào mã và được trình biên dịch phân tích khi dự án được xây dựng. Chúng ta sử dụng chỉ thị tiền xử lý để sửa đổi mã được biên dịch bằng cách thêm hoặc loại bỏ các phần theo ký hiệu được định nghĩa.
Tất cả chỉ thị tiền xử lý bắt đầu bằng #, trong một dòng chỉ có các ký tự khoảng trắng mới xuất hiện trước một chỉ thị tiền xử lý. Các chỉ thị tiền xử lý không phải là câu lệnh, vì vậy chúng không kết thúc bằng dấu chấm phẩy (;).
Trình biên dịch C# không có bộ tiền xử lý (preprocessor) riêng, nhưng các chỉ thị thì được xử lý riêng. Trong C#, chỉ thị tiền xử lý được sử dụng để hỗ trợ biên dịch có điều kiện. Không giống như các chỉ thị trong C và C++, chúng không được sử dụng để tạo macro. Một chỉ thị tiền xử lý phải là duy nhất trên một dòng.
Trong C# bao gồm các chỉ thị tiền xử lý dưới đây:
#if
#else
#elif
#endif
#define
#undef
#warning
#error
#line
#region
#endregion
Chúng ta sử dụng chỉ thị tiền xử lý trong C# để:
Biên dịch có điều kiện: Sử dụng chỉ thị tiền xử lý đặc biệt, bạn có thể thêm hoặc loại bỏ các phần của chương trình theo các điều kiện khác nhau.
Line control: Nếu sử dụng chương trình kết hợp hoặc sắp xếp các file thành một file trung gian, sau đó biên dịch, bạn có thể sử dụng Line control để thông báo cho trình biên dịch vị trí các dòng nguồn.
Báo cáo lỗi và cảnh báo: Chỉ thị '#error' khiến bộ tiền xử lý báo cáo lỗi nghiêm trọng, tương tự chỉ thị '#warning' khiến bộ tiền xử lý đưa ra cảnh báo và tiếp tục tiền xử lý.
#define và #undef
Chỉ thị tiền xử lý #define được sử dụng để định nghĩa một ký hiệu hoặc tên mã token. Bạn có thể sử dụng biểu tượng này trong đoạn mã với các chỉ thị tiền xử lý #if và #elif.
Để dễ hình dung, bạn đọc cùng tham khảo dòng mã dưới đây:
#define DEBUG
Dòng mã trên định nghĩa ký hiệu có tên là DEBUG. Mặc dù không bắt buộc, nhưng thông lệ là định nghĩa các ký hiệu bằng chữ in hoa.
Về cơ bản dòng trên tương tự như khai báo biến, chỉ khác là nó không chiếm dụng bộ nhớ lưu trữ nào và không thể lưu trữ bất kỳ giá trị nào cả.
Một lưu ý quan trọng là tất cả chỉ thị #define mà bạn đang sử dụng phải đặt ở đầu file mã nguồn. Nếu đặt ở vị trí khác, nó sẽ trả về thông báo lỗi như dưới đây:
Một biểu tượng có thể được định nghĩa bằng cách sử dụng #define hoặc cũng có thể được truyền thông qua dòng lệnh. Vì vậy một biểu tượng có thể không được định nghĩa bằng cách sử dụng chỉ thị #undef.
#undef DEBUG
Undef là biểu tượng tương tự như xóa để nó không tồn tại cho mã sau đó.
#if, #else, #elif và #endif
Sử dụng các biểu tượng được định nghĩa bằng cách sử dụng #define khi chúng được kết hợp với các chỉ thị #if và #elif. Các chỉ thị tiền xử lý này cho phép bạn kiểm tra xem một biểu tượng cụ thể đã được định nghĩa hay chưa. Dựa trên kết quả của phần kiểm tra này, bạn có thể biên dịch đoạn mã có điều kiện.
Ví dụ dưới đây minh họa các mã được biên dịch như thế nào:
#define DEBUG
...
#if DEBUG
Console.WriteLine("You have defined DEBUG symbol");
#endif
Trong đoạn mã trên, trước hết chúng ta định nghĩa biểu tượng DEBUG, tiếp theo chúng ta sử dụng chỉ thị #if để kiểm tra xem DEBUG có được định nghĩa hay không.
Nếu có, đầu ra sẽ hiển thị thông báo bằng cách sử dụng Console.WriteLine(). Nếu chạy ứng dụng này, đầu ra sẽ có dạng như hình dưới đây:
Nếu xóa dòng #define hoặc không định nghĩa biểu tượng DEBUG, sau đó chạy ứng dụng thì bạn sẽ không nhận được thông báo vì điều kiện #if sẽ đánh giá là sai.
Ngoài ra bạn có thể kiểm tra nhiều biểu tượng bằng cách sử dụng #elif như hình dưới đây:
Hoặc có thể kiểm tra nhiều biểu tượng trong một chỉ thị tiền xử lý #if bằng cách sử dụng toán tử - ==, !=, && và ||.
Ví dụ dưới đây minh họa cách sử dụng các toán tử này:
#warning và #error
Đúng như tên gọi của nó, các chỉ thị tiền xử lý #warning và #error được sử dụng để hiển thị các cảnh báo và lỗi tương ứng. Điểm khác nhau duy nhất giữa #warning và #error là #warning không ngừng hiển thị thông báo trong quá trình biên dịch còn #error tạm dừng quá trình biên dịch để hiển thị thông báo lỗi.
Đoạn mã dưới đây minh họa cách sử dụng #warning và #error:
#if EVAL && FULL
#warning "You have defined EVAL as well as FULL"
#endif
Đoạn mã trên kiểm tra xem biểu tượng EVAL cũng như biểu tượng FULL được định nghĩa hya không, nếu có một cảnh báo, hoặc thông báo sẽ được xuất. Nếu đang xây dựng dự án có 2 biểu tượng này được định nghĩa, bạn sẽ nhận được cảnh báo như dưới đây:
Nếu sử dụng #error thay vì #warning, bạn sẽ gặp phải lỗi như dưới đây:
#region và #endregion
Các chỉ thị tiền xử lý #region và #endregion hữu ích trong trường hợp khi bạn mã hóa trong Visual Studio IDE, cho phép bạn định nghĩa một vùng mã là một khối duy nhất để thu gọn hoặc mở rộng toàn bộ khối. Cùng tham khảo ví dụ đoạn mã dưới đây:
Ở đây chúng ta định nghĩa vùng Public Properties sử dụng các chỉ thị #region và #endregion. Vùng này có chứa tất cả các thuộc tính công khai được định nghĩa bởi một lớp. Chúng ta có thể mở rộng hoặc thu gọn vùng bằng cách sử dụng các biểu tượng - hoặc + bên lề trình chỉnh sửa Visual Studio.
Nếu đang chật vật với hàng trăm dòng mã khác nhau trong một file, việc sử dugnj các chỉ thị tiền xử lý #region và #endregion để chia toàn bộ mã thành nhiều vùng logic, giúp nâng cao trải nghiệm mã hóa của bạn.
#line
Chỉ thị tiền xử lý #line được sử dụng để sửa đổi số dòng và tên file xuất hiện trong các thông báo lỗi trình biên dịch. Cho ví dụ dưới đây:
Có một lỗi cú pháp ở dòng số 14 (inta a = 100) và tên file là Program.cs. Nếu cố gắng biên dịch dự án này, bạn sẽ nhận được thông báo lỗi dưới đây:
Bây giờ bạn có thể sử dụng chỉ thị #line để thay đổi số dòng mặc định và tên file:
Ở đây, số dòng được đặt là 400 và tên file được đặt là MyFile.cs. Khi biên dịch đoạn mã này sẽ trả về thông báo lỗi như dưới đây:
Như bạn có thể thấy dòng số 0 và tên file được hiển thị trong danh sách lỗi hiện được chọn từ chỉ thị #line.
Chỉ thị tiền xử lý #line hữu ích trong các trường hợp, trong đó mã nguồn được sửa đổi bởi một số công cụ hoặc hệ thống bên ngoài (ASP.NET là một ví dụ).
#pragma
Chỉ thị tiền xử lý #pragma hướng dẫn trình biên dịch về việc biên dịch các file đang được xem xét. Các hướng dẫn có sử dụng #pragma phải được trình biên dịch hỗ trợ. Trình biên dịch C# hỗ trợ 2 hướng dẫn dưới đây:
#pragma warning
#pragma checksum
Dưới đây là ví dụ minh họa cách sử dụng #pragma, trong đó cảnh báo 219 bị vô hiệu hóa:
#pragma vô hiệu hóa cảnh báo 219
Cảnh báo 219 là cảnh báo cho biến được gán nhưng giá trị của nó không được sử dụng. Sau khi vô hiệu hóa trình biên dịch sẽ ngừng hiển thị cảnh báo 219.
Như vậy bài viết trên đây Taimienphi.vn vừa giới thiệu cho bạn về chỉ thị tiền xử lý (Preprocessor Directive) trong C# cũng như các ví dụ minh họa từng chỉ thị tiền xử lý một. Ngoài ra bạn đọc có thể tham khảo thêm một số bài viết khác đã có trên Taimienphi.vn để tìm hiểu rõ hơn về nạp chồng toán tử trong C# là gì nhé.