44
Chương 1: Phát triển ứng dụng
||
#if winXP || release
Phép OR luận lý. Đúng nếu
winXP
hoặc
release
được định nghĩa.
()
#if (winXP ||
win2000) && release
Dấu ngoặc đơn cho phép nhóm các biểu thức. Đúng
nếu
winXP
hoặc
win2000
được định nghĩa, đồng thời
release
cũng được định nghĩa.
Bạn không nên lạm dụng các chỉ thị biên dịch có điều kiện và không nên viết các
biểu thức điều kiện quá phức tạp; nếu không, mã nguồn của bạn sẽ trở nên dễ
nhầm lẫn và khó quản lý—đặc biệt khi dự án của bạn càng lớn.
Một cách khác không linh hoạt nhưng hay hơn chỉ thị tiền xử lý
#if
là sử dụng đặc tính
System.Diagnostics.ConditionalAttribute
. Nếu bạn áp dụng
ConditionalAttribute
cho
một phương thức, trình biên dịch sẽ bỏ qua mọi lời gọi phương thức đó nếu ký hiệu do
ConditionalAttribute
chỉ định không được định nghĩa tại điểm gọi. Trong đoạn mã sau,
ConditionalAttribute
xác định rằng phương thức
DumpState
chỉ được biên dịch vào file thực
thi nếu ký hiệu
DEBUG
được định nghĩa khi biên dịch.
[System.Diagnostics.Conditional("DEBUG")]
public static void DumpState() {//...}
Việc sử dụng
ConditionalAttribute
giúp đặt các điều kiện gọi một phương thức tại nơi khai
báo nó mà không cần các chỉ thị
#if
. Tuy nhiên, bởi vì trình biên dịch thật sự bỏ qua các lời
gọi phương thức, nên mã của bạn không thể phụ thuộc vào các giá trị trả về từ phương thức.
Điều này có nghĩa là bạn có thể áp dụng
ConditionalAttribute
chỉ với các phương thức trả
về
void
.
Bạn có thể áp dụng nhiều thể hiện
ConditionalAttribute
cho một phương thức, tương đương
với phép OR luận lý. Các lời gọi phương thức
DumpState
dưới đây chỉ được biên dịch nếu
DEBUG
hoặc
TEST
được định nghĩa.
[System.Diagnostics.Conditional("DEBUG")]
[System.Diagnostics.Conditional("TEST")]
public static void DumpState() {//...}
Việc thực hiện phép AND luận lý cần sử dụng phương thức điều kiện trung gian, khiến cho
mã trở nên quá phức tạp, khó hiểu và khó bảo trì. Ví dụ dưới đây cần phương thức trung gian
DumpState2
để định nghĩa cả hai ký hiệu
DEBUG
và
TEST
.
[System.Diagnostics.Conditional("DEBUG")]
public static void DumpState() {
DumpState2();
}
[System.Diagnostics.Conditional("TEST")]
public static void DumpState2() {//...}